From nobody Wed Aug 26 07:24:09 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=1786459033; cv=none; d=zohomail.com; s=zohoarc; b=XqoQXcPkGvuZ975r7Mm93dU/+q/nZv5IBFrqRDltRSGNqy0R3PPFFcf1jqh8qv81TUtfC4THzeoM/+x/dKmSDmOsYBzIunLEKYCKDnefd2rpSFZabfEIGVRr+9r6UsK/F4SBgcyj/IxYAtmz8zd0YdVJiWR4r8ttdUBK5tsh3zI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459033; 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=m8gPdHI+Ds5LqV2bfDnAST49zddjrC5ItzX+eBJ7ffQ=; b=jCz47cYQDG3z5LiHg8IxInucxEWo5JpsZW8VbDnjQm6Sh9UmPk+1l3nSDXVuMY/SxhccM44bznJNJchmbBJec9L5EEy9vGFejNY6iiUWH7PDSxPtdeVwnIMgmI4TjGFZ6qJmUKB5fCgBIomw5XQRmQSANZ0On9RcwF3sFaQ2bhg= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459033679186.45090607521024; Tue, 11 Aug 2026 07:37:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnaH-0000FL-2v; Tue, 11 Aug 2026 10:36:05 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaF-0000Ee-Hq for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:03 -0400 Received: from mail-qv1-xf2b.google.com ([2607:f8b0:4864:20::f2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaD-0001qB-9m for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:03 -0400 Received: by mail-qv1-xf2b.google.com with SMTP id 6a1803df08f44-8ef1dc934d1so8192586d6.0 for ; Tue, 11 Aug 2026 07:36:00 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.35.59 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:35:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458960; x=1787063760; 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:content-type; bh=m8gPdHI+Ds5LqV2bfDnAST49zddjrC5ItzX+eBJ7ffQ=; b=HySLW8IN+T/aIPtOP0zfy2sJ1hY8dJYhKdCCdL4jytSOVrEkQuwmC9W9waB7kekVez lNl5ajpFmR5gpk7KvcE3BBRdW/6qVa4wwyVE8FLIKHFY2or9fQ/1kzVCiu4l0Ld/ZZtO BYYEB4CS/G+eyuUvXVG9GW3mTLCkUb+h5VTqkbeIB9bW1JBOkuyNSSWXAjsWgUJz/sKI gHVq108W7rZPrcayOHDcF7+Nk6Qcwugbg/bVm+cxcBLtHP4yCRhQYp8eyUapR2gZGs6U G9O/6JRVRfcux4DzWgLVjJt5RIsY0MKr2+5KWvVwoAL+fNKNjaWLcCOu1QwOGArNoySh GBiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458960; x=1787063760; 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:content-type; bh=m8gPdHI+Ds5LqV2bfDnAST49zddjrC5ItzX+eBJ7ffQ=; b=AJ8tpwgZzLfD8SJXP7itFQjqWeUItmHPTn6PhCckQFGSaYYmpZX3zdzKwYe10G0cQb 4y3SYGGistwS+bUN1iyFMF5t+Pa5Gb7YEzxi5bLpO/EffCCJKJOIUltI0TTo8BAQdrm7 ccbVS8yEUB70+HZdkdqp/dzUyxekKWknatRg3CMNC8PJGthtteY3wBcRuVcwsA1AXMNV nNk05+XUQ4x7TwrT9R9bb9n/lQ9ruG4OCYtNjmMquGO34S3E+bbKRp8409VwefEI/sSy UHjtFlPPmOuPnQIZ7EeB52hzTXG8HyzJr/GPEwBm3LFDQSnLQsC7ZrMnBQugzEDlqH3f /qxQ== X-Gm-Message-State: AOJu0YyEHTS/Oajhcp6WoUqvstHJ4L/xdr084sAwQYdnX70iq3Usagb0 Hrs7BZT5bT5UcNpYOjFdSM78YkE3tb0KXOkACYsjhcMSUR5+/gJfK2/4kei5TQ== X-Gm-Gg: AR+sD12kPhi+JJ56S7FDGNQIePSPzyHzpvzl+bdKRdGTvmoiKnEhxMjSR2spSqDKXBf xCBMc1mSV/WkE/OfgW7I/yZrLWCGmFJSYGoYu1XXOtQHBCDaigGvN5tdHdB+xA7vx+xMBTjUqNe lV+0Sq7KXcnvyK9uLIw+9vyRGUyK7XNfTyEEMSfbiZYbIK4+fnjZ5LOaTMNA2Gdlr+PJdUj2yh1 Oqgkxff+Eyq8DUWKY6k8iBbNeO+es7KE3xlvqTvuQaZOf8MI6dh6cjlTBLvKSPcLdDHsAGvikI4 jH3Gr/T62gsgJllnQjiaMJ1Rh6wsWrpoANvwbdP8T/ehlSaxNmPPgeUdU1K+5j0RR30TUMXRTxY 5UZxCMc9jQZnmBVoc/rq45Zm4vChmUQT+mQ3uP5DXDYT5jnPJ6H0UmVFTOjcrWIonZ+/bIYIeMX lmH1Xdc+z/Yfr7YPov/LD03qfYrm7UW7Pzra6xQMFjVZZzSuuVCmPjBW/+wLMajj9Xoft0/awVg fz+a7Sq06F6z34ANtxW X-Received: by 2002:a05:6214:496:b0:90a:5779:d30a with SMTP id 6a1803df08f44-90a6ba36f5bmr7053506d6.6.1786458960173; Tue, 11 Aug 2026 07:36:00 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 01/19] hw/arm/bcm2838_pcie: add BCM2838 PCIe Root Complex Date: Tue, 11 Aug 2026 10:35:38 -0400 Message-ID: <20260811143557.7862-2-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f2b; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf2b.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: 1786459035282158500 Content-Type: text/plain; charset="utf-8" Add the PCI-facing "root" part (D0:F0) of the BCM2838 (Raspberry Pi 4B / BCM2711) PCIe Root Complex: a PCIe root port with the vendor's device/vendor IDs and capability offsets, not usable on its own without the host-facing part added in the next patch. Adapted from patch 13/41 of Sergey Kambalin's "Raspberry Pi 4B machine" series (patchwork series 829638, posted to qemu-devel in 2024 but never merged) against current QEMU master; the surrounding PCIe/GENET networking support for raspi4b was left unmerged upstream (base scaffolding aside), so this and the following patches complete and debug that series to get real networking working under raspi4b. Signed-off-by: Marcelo Manzo --- hw/arm/bcm2838_pcie.c | 82 +++++++++++++++++++++++++++++++++++ hw/arm/meson.build | 4 +- include/hw/arm/bcm2838_pcie.h | 53 ++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 hw/arm/bcm2838_pcie.c create mode 100644 include/hw/arm/bcm2838_pcie.h diff --git a/hw/arm/bcm2838_pcie.c b/hw/arm/bcm2838_pcie.c new file mode 100644 index 0000000000..96a45c1863 --- /dev/null +++ b/hw/arm/bcm2838_pcie.c @@ -0,0 +1,82 @@ +/* + * BCM2838 PCIe Root Complex emulation + * + * Copyright (C) 2022 Ovchinnikov Vitalii + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "hw/core/irq.h" +#include "hw/pci-host/gpex.h" +#include "hw/core/qdev-properties.h" +#include "migration/vmstate.h" +#include "qemu/module.h" +#include "hw/arm/bcm2838_pcie.h" +#include "trace.h" + +/* + * RC root part (D0:F0) + */ + +static void bcm2838_pcie_root_port_reset_hold(Object *obj, ResetType type) +{ + PCIERootPortClass *rpc =3D PCIE_ROOT_PORT_GET_CLASS(obj); + PCIDevice *dev =3D PCI_DEVICE(obj); + BCM2838PcieRootState *s =3D BCM2838_PCIE_ROOT(dev); + + if (rpc->parent_phases.hold) { + rpc->parent_phases.hold(obj, type); + } + + memset(s->regs, 0xFF, sizeof(s->regs)); +} + +static void bcm2838_pcie_root_init(Object *obj) +{ + PCIBridge *br =3D PCI_BRIDGE(obj); + br->bus_name =3D "pcie.1"; +} + +static void bcm2838_pcie_root_class_init(ObjectClass *class, const void *d= ata) +{ + DeviceClass *dc =3D DEVICE_CLASS(class); + PCIDeviceClass *k =3D PCI_DEVICE_CLASS(class); + ResettableClass *rc =3D RESETTABLE_CLASS(class); + PCIERootPortClass *rpc =3D PCIE_ROOT_PORT_CLASS(class); + + dc->desc =3D "BCM2711 PCIe Bridge"; + /* + * PCI-facing part of the host bridge, not usable without the host-fac= ing + * part, which can't be device_add'ed. + */ + + resettable_class_set_parent_phases(rc, NULL, + bcm2838_pcie_root_port_reset_hold, + NULL, &rpc->parent_phases); + + dc->user_creatable =3D false; + k->vendor_id =3D BCM2838_PCIE_VENDOR_ID; + k->device_id =3D BCM2838_PCIE_DEVICE_ID; + k->revision =3D BCM2838_PCIE_REVISION; + + rpc->exp_offset =3D BCM2838_PCIE_EXP_CAP_OFFSET; + rpc->aer_offset =3D BCM2838_PCIE_AER_CAP_OFFSET; +} + +static const TypeInfo bcm2838_pcie_root_info =3D { + .name =3D TYPE_BCM2838_PCIE_ROOT, + .parent =3D TYPE_PCIE_ROOT_PORT, + .instance_size =3D sizeof(BCM2838PcieRootState), + .instance_init =3D bcm2838_pcie_root_init, + .class_init =3D bcm2838_pcie_root_class_init, +}; + +static void bcm2838_pcie_register(void) +{ + type_register_static(&bcm2838_pcie_root_info); +} + +type_init(bcm2838_pcie_register) diff --git a/hw/arm/meson.build b/hw/arm/meson.build index 4233a800be..b02aa346bf 100644 --- a/hw/arm/meson.build +++ b/hw/arm/meson.build @@ -104,7 +104,9 @@ arm_common_ss.add(when: 'CONFIG_EXYNOS4', if_true: file= s('exynos4_boards.c')) arm_common_ss.add(when: 'CONFIG_MAX78000FTHR', if_true: files('max78000fth= r.c')) arm_common_ss.add(when: 'CONFIG_NETDUINO2', if_true: files('netduino2.c')) arm_common_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_peripheral= s.c')) -arm_common_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2838_peripheral= s.c')) +arm_common_ss.add(when: 'CONFIG_RASPI', if_true: files( + 'bcm2838_peripherals.c', + 'bcm2838_pcie.c')) arm_common_ss.add(when: 'CONFIG_STRONGARM', if_true: files('strongarm.c')) arm_common_ss.add(when: 'CONFIG_SX1', if_true: files('omap_sx1.c')) arm_common_ss.add(when: 'CONFIG_VERSATILE', if_true: files('versatilepb.c'= )) diff --git a/include/hw/arm/bcm2838_pcie.h b/include/hw/arm/bcm2838_pcie.h new file mode 100644 index 0000000000..fe7a6cff19 --- /dev/null +++ b/include/hw/arm/bcm2838_pcie.h @@ -0,0 +1,53 @@ +/* + * BCM2838 PCIe Root Complex emulation + * + * Copyright (C) 2022 Ovchinnikov Vitalii + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef BCM2838_PCIE_H +#define BCM2838_PCIE_H + +#include "exec/hwaddr.h" +#include "hw/core/sysbus.h" +#include "hw/pci/pci.h" +#include "hw/pci/pcie_host.h" +#include "hw/pci/pcie_port.h" +#include "qom/object.h" + +#define TYPE_BCM2838_PCIE_ROOT "bcm2838-pcie-root" +OBJECT_DECLARE_TYPE(BCM2838PcieRootState, BCM2838PcieRootClass, + BCM2838_PCIE_ROOT) + +#define BCM2838_PCIE_VENDOR_ID 0x14E4 +#define BCM2838_PCIE_DEVICE_ID 0x2711 +#define BCM2838_PCIE_REVISION 20 + +#define BCM2838_PCIE_REGS_SIZE 0x9310 +#define BCM2838_PCIE_NUM_IRQS 4 + +#define BCM2838_PCIE_EXP_CAP_OFFSET 0xAC +#define BCM2838_PCIE_AER_CAP_OFFSET 0x100 + +#define BCM2838_PCIE_EXT_CFG_DATA 0x8000 +#define BCM2838_PCIE_EXT_CFG_INDEX 0x9000 + +struct BCM2838PcieRootState { + /*< private >*/ + PCIESlot parent_obj; + + /*< public >*/ + uint8_t regs[BCM2838_PCIE_REGS_SIZE - PCIE_CONFIG_SPACE_SIZE]; +}; + +struct BCM2838PcieRootClass { + /*< private >*/ + PCIERootPortClass parent_obj; + + /*< public >*/ + void (*parent_realize)(PCIDevice *dev, Error **errp); +}; + + +#endif /* BCM2838_PCIE_H */ --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786458996; cv=none; d=zohomail.com; s=zohoarc; b=aq6A5aIjdGeclIGs82kDryE3fiDkSaVKW/sltiTPzysa6MUhr5AR216nefAIYFOvUD2/7H99LZMZ2qn73Ku8yOWVct3liEeQRXDC1Dv9jHH3H7hXudq5MgXm8hX4XqmrENFVIPWg4oXvVYt1ibztOpv+caM6MJNVD/9//gJH+9k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786458996; 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=cJ8jtKxyaeHLKb8ERCj0eNyzfY4HJqGC8EypzbLKF5I=; b=PjAEMemg8vzB6H8a5EGgBu35LcOGK92tXXMw+j+u4tE1qtjdVKYs+WCqCJGxLJCJqo6vW1QuLUS5IUanKxZ4eJmT0k9gEuCzGSa8qIwbcPeiKYipgbiA5+kWSW0O2XMsJxvk1+RSy/sRyc+tK3hJ44OQJgfPmFN8bDOD4NqBCDw= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786458996787372.7250710393737; Tue, 11 Aug 2026 07:36:36 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnaJ-0000HB-7Y; Tue, 11 Aug 2026 10:36:07 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaG-0000FB-Nt for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:04 -0400 Received: from mail-qk1-x729.google.com ([2607:f8b0:4864:20::729]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaE-0001qf-AK for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:04 -0400 Received: by mail-qk1-x729.google.com with SMTP id af79cd13be357-92e50a650a0so150360585a.1 for ; Tue, 11 Aug 2026 07:36:01 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.00 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458961; x=1787063761; 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:content-type; bh=cJ8jtKxyaeHLKb8ERCj0eNyzfY4HJqGC8EypzbLKF5I=; b=Dr+z99Sl69mi4ervN+JkIAYN0LVS3pfB0PN9UVhvOZtfxGiBYrEOQSPcgyMVbSu0bX TB60/lyIrXRZFDmuoH0XFesb9SvCyqPgRiiCl26SDsHb2toOmdgMPBB/AR7DZXEQrCLA i4DFYozbqF1mAN1Vszh4t2JabnMRkRbxshfdxvJZrRH3Ex8s2xt+2xDgt89Nry1/l8tQ V2AvTB5BsToNauGOGuMGjad2LIPX9eob5DFQ51Grj+ALHKFOMY2GuwWei7fsj2vQGxJf XEiE94ZB5fT/9wN58UvlpFwhqTHYOcyNz7bn3JcqXttMVpavEZbYZEtFy1MdU23TAw+o T7ag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458961; x=1787063761; 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:content-type; bh=cJ8jtKxyaeHLKb8ERCj0eNyzfY4HJqGC8EypzbLKF5I=; b=pzYGp42qMLkEyl57goza4tw+sWPMA0onN0pXVjwADnIgMnknSXxbYfM752sidoAji3 LCq9nTsX/7PnKN3kwbZhTQeiKQORvkr74xH4FqanCAN/4E3rby8W5wpUFpPkwyqswyho CcTYhvDkkwRw24RUP9fYfUHUmDwc9jIlO1N8d8mj374kTmcH/KD6S458GSQv3u65Obcp vtXcmpzyBysJ5QM/9V2dqnHUca8IogFl1dJhz5A67jit3/C+5jUHhXvQLzRXQ7/aElnk 7MSat7k6ap3q0zQyaY6bgXLmfVz6+M28VznKWUVYpYj2vh17WZc/IFLNpwIJWWiNmFvA Mi2A== X-Gm-Message-State: AOJu0Yxlwc+GDTuDBjK+wTABnAU6tvIhYw/qIR46gZwa7ekW2XGwPfZW XU4QyDIe1ZQPfjD5FuaZAs0fonHHs7TWs6Jjuf680CraykdmywBXcmxt7AJHig== X-Gm-Gg: AR+sD10NKHZLMp1Ayte3Cj2ixHyoDlRk+MQHAJMiN/gmYeNb4JANZn5TQsQsY30Hhfb FQRAWAMFvDhdiQNS8rWU8WX5G0jjWh+A2htTRWE8tPI6sn3OWLYbCCs2NtNOkUF6B5i4SBqqYM4 Qev0rZsaCcAMRBCcT5X3mhcfd5pCkCeGQwioMC/gCRgNqS4FJ9wYM088ltOVU/84aJrlAsQR2vJ k4LEP9hUBpB3qtoY4vFb6ZMR0MeMQlCHNMOmN7XD/myFY2tU7hEl9w6sJkiYfZ3NbqMZWiDr03i rtYZJDMZFzM4f3kAXXGkLCdMPWzwl+L7GFNxM3KOkVXSTwPZJyZpjZwEvP4y35TV3H+9d1rZeKg sPt3cL/D2PcddR+z7SWE8WDxVmiSYG7h8QxQhGE4q+TgOlx1kESBdib/DdQKUi9vyDPvItVyVKr aCkM9sxWT2IGXvHBL4LapklC/u4X5vdFOGqlSR2yoHkCSmVusAfXnTnW2qGNYeNME+QwNdYORsQ sh6sQfOLLR4qIEFEgY= X-Received: by 2002:a05:620a:2cc2:b0:92e:f3ca:2ec9 with SMTP id af79cd13be357-936ad561c74mr80293985a.40.1786458961207; Tue, 11 Aug 2026 07:36:01 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 02/19] hw/arm/bcm2838_pcie: add BCM2838 PCIe host Date: Tue, 11 Aug 2026 10:35:39 -0400 Message-ID: <20260811143557.7862-3-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::729; envelope-from=marcelomanzo@gmail.com; helo=mail-qk1-x729.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=ham 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: 1786458999443158500 Content-Type: text/plain; charset="utf-8" Add the BCM2838 PCIe host bridge model: config space, MMIO window, and register access for the root port. Per Peter Maydell's review of a later follow-up series, fold in what was originally a separate bugfix here, since this device isn't in upstream git yet and the bug was in code this patch itself introduces. Four defects fixed, all on the enumeration path (none of this was exercised until a later patch actually attaches a PCI device): 1. bcm2838_pcie_host_read/write computed "offset - PCIE_CONFIG_SPACE_SIZE" on an unsigned hwaddr, which underflows for every offset below 4KB. The root port's own config space -- including vendor/device ID at offset 0 -- therefore always fell into the out-of-range branch and read back as all-ones, i.e. "no device present", so the guest stopped scanning immediately. 2. pcie_host_mmcfg_init() was never called, yet both accessors dereference pcie_hb->mmio.ops to service EXT_CFG_DATA. Once (1) was fixed and the guest actually reached that path, it touched an uninitialised MemoryRegion. 3. The root port overrode PCIDeviceClass::config_read/config_write with plain pci_default_*_config(). That bypasses rp_write_config() -> pci_bridge_write_config(), so programming the bridge's memory window never updated the bridge's address space and BARs behind the root port stayed unreachable. Drop the overrides and dispatch through pci_host_config_{read,write}_common() so the device's real handlers run. Signed-off-by: Marcelo Manzo --- hw/arm/bcm2838_pcie.c | 226 ++++++++++++++++++++++++++++++++++ hw/arm/trace-events | 4 + include/hw/arm/bcm2838_pcie.h | 22 ++++ 3 files changed, 252 insertions(+) diff --git a/hw/arm/bcm2838_pcie.c b/hw/arm/bcm2838_pcie.c index 96a45c1863..88166d1f44 100644 --- a/hw/arm/bcm2838_pcie.c +++ b/hw/arm/bcm2838_pcie.c @@ -11,12 +11,237 @@ #include "qapi/error.h" #include "hw/core/irq.h" #include "hw/pci-host/gpex.h" +#include "hw/pci/pci_host.h" #include "hw/core/qdev-properties.h" #include "migration/vmstate.h" #include "qemu/module.h" #include "hw/arm/bcm2838_pcie.h" #include "trace.h" =20 +static uint64_t bcm2838_pcie_host_read(void *opaque, hwaddr offset, + unsigned size) { + hwaddr mmcfg_addr; + uint64_t value =3D ~0; + BCM2838PcieHostState *s =3D opaque; + PCIExpressHost *pcie_hb =3D PCIE_HOST_BRIDGE(s); + uint8_t *root_regs =3D s->root_port.regs; + uint32_t *cfg_idx =3D (uint32_t *)(root_regs + BCM2838_PCIE_EXT_CFG_IN= DEX + - PCIE_CONFIG_SPACE_SIZE); + + if (offset < PCIE_CONFIG_SPACE_SIZE) { + /* + * The first 4KB of the window is the root port's own PCI config + * space (vendor/device ID, BARs, capabilities). Serve it from the + * real PCIDevice, not from the raw regs[] shadow buffer, which is + * only backing store for the controller registers above 4KB. + */ + value =3D pci_host_config_read_common(PCI_DEVICE(&s->root_port), + offset, PCIE_CONFIG_SPACE_SIZE, + size); + } else if (offset - PCIE_CONFIG_SPACE_SIZE + size + <=3D sizeof(s->root_port.regs)) { + switch (offset) { + case BCM2838_PCIE_EXT_CFG_DATA + ... BCM2838_PCIE_EXT_CFG_DATA + PCIE_CONFIG_SPACE_SIZE - 1: + mmcfg_addr =3D *cfg_idx + | PCIE_MMCFG_CONFOFFSET(offset - BCM2838_PCIE_EXT_CFG_DATA= ); + value =3D pcie_hb->mmio.ops->read(opaque, mmcfg_addr, size); + break; + default: + memcpy(&value, root_regs + offset - PCIE_CONFIG_SPACE_SIZE, si= ze); + } + } else { + qemu_log_mask( + LOG_GUEST_ERROR, + "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", + __func__, size, offset); + } + + trace_bcm2838_pcie_host_read(size, offset, value); + return value; +} + +static void bcm2838_pcie_host_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) { + hwaddr mmcfg_addr; + BCM2838PcieHostState *s =3D opaque; + PCIExpressHost *pcie_hb =3D PCIE_HOST_BRIDGE(s); + uint8_t *root_regs =3D s->root_port.regs; + uint32_t *cfg_idx =3D (uint32_t *)(root_regs + BCM2838_PCIE_EXT_CFG_IN= DEX + - PCIE_CONFIG_SPACE_SIZE); + + trace_bcm2838_pcie_host_write(size, offset, value); + + if (offset < PCIE_CONFIG_SPACE_SIZE) { + /* Root port's own PCI config space -- see read path above */ + pci_host_config_write_common(PCI_DEVICE(&s->root_port), offset, + PCIE_CONFIG_SPACE_SIZE, value, size); + } else if (offset - PCIE_CONFIG_SPACE_SIZE + size + <=3D sizeof(s->root_port.regs)) { + switch (offset) { + case BCM2838_PCIE_EXT_CFG_DATA + ... BCM2838_PCIE_EXT_CFG_DATA + PCIE_CONFIG_SPACE_SIZE - 1: + mmcfg_addr =3D *cfg_idx + | PCIE_MMCFG_CONFOFFSET(offset - BCM2838_PCIE_EXT_CFG_DATA= ); + pcie_hb->mmio.ops->write(opaque, mmcfg_addr, value, size); + break; + default: + memcpy(root_regs + offset - PCIE_CONFIG_SPACE_SIZE, &value, si= ze); + } + } else { + qemu_log_mask( + LOG_GUEST_ERROR, + "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", + __func__, size, offset); + } +} + +static const MemoryRegionOps bcm2838_pcie_host_ops =3D { + .read =3D bcm2838_pcie_host_read, + .write =3D bcm2838_pcie_host_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .impl =3D {.max_access_size =3D sizeof(uint64_t)}, +}; + +int bcm2838_pcie_host_set_irq_num(BCM2838PcieHostState *s, int index, int = spi) +{ + if (index >=3D BCM2838_PCIE_NUM_IRQS) { + return -EINVAL; + } + + s->irq_num[index] =3D spi; + return 0; +} + +static void bcm2838_pcie_host_set_irq(void *opaque, int irq_num, int level) +{ + BCM2838PcieHostState *s =3D opaque; + + qemu_set_irq(s->irq[irq_num], level); +} + +static PCIINTxRoute bcm2838_pcie_host_route_intx_pin_to_irq(void *opaque, + int pin) +{ + PCIINTxRoute route; + BCM2838PcieHostState *s =3D opaque; + + route.irq =3D s->irq_num[pin]; + route.mode =3D route.irq < 0 ? PCI_INTX_DISABLED : PCI_INTX_ENABLED; + + return route; +} + +static int bcm2838_pcie_host_map_irq(PCIDevice *pci_dev, int pin) +{ + return pin; +} + +static void bcm2838_pcie_host_realize(DeviceState *dev, Error **errp) +{ + PCIHostState *pci =3D PCI_HOST_BRIDGE(dev); + BCM2838PcieHostState *s =3D BCM2838_PCIE_HOST(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + PCIExpressHost *pex =3D PCIE_HOST_BRIDGE(dev); + + int i; + + /* + * Initialise the ECAM config-space window. The BCM2838 does not expose + * it to the guest directly; config accesses are made indirectly throu= gh + * the EXT_CFG_INDEX/EXT_CFG_DATA register pair, which dispatch into + * pex->mmio. Without this the ops pointer is never set up. + */ + pcie_host_mmcfg_init(pex, PCIE_MMCFG_SIZE_MAX); + + memory_region_init_io(&s->cfg_regs, OBJECT(s), &bcm2838_pcie_host_ops,= s, + "bcm2838_pcie_cfg_regs", BCM2838_PCIE_REGS_SIZE); + sysbus_init_mmio(sbd, &s->cfg_regs); + + /* + * The MemoryRegions io_mmio and io_ioport that we pass to + * pci_register_root_bus() are not the same as the MemoryRegions + * io_mmio_window and io_ioport_window that we expose as SysBus MRs. + * The difference is in the behavior of accesses to addresses where no= PCI + * device has been mapped. + * + * io_mmio and io_ioport are the underlying PCI view of the PCI address + * space, and when a PCI device does a bus master access to a bad addr= ess + * this is reported back to it as a transaction failure. + * + * io_mmio_window and io_ioport_window implement "unmapped addresses r= ead as + * -1 and ignore writes"; this is a traditional x86 PC behavior, which= is + * not mandated properly by the PCI spec but expected by the majority = of + * PCI-using guest software, including Linux. + * + * We implement it in the PCIe host controller, by providing the *_win= dow + * MRs, which are containers with io ops that implement the 'backgroun= d' + * behavior and which hold the real PCI MRs as sub-regions. + */ + memory_region_init(&s->io_mmio, OBJECT(s), "bcm2838_pcie_mmio", UINT64= _MAX); + memory_region_init(&s->io_ioport, OBJECT(s), "bcm2838_pcie_ioport", + 64 * 1024); + + memory_region_init_io(&s->io_mmio_window, OBJECT(s), + &unassigned_io_ops, OBJECT(s), + "bcm2838_pcie_mmio_window", UINT64_MAX); + memory_region_init_io(&s->io_ioport_window, OBJECT(s), + &unassigned_io_ops, OBJECT(s), + "bcm2838_pcie_ioport_window", 64 * 1024); + + memory_region_add_subregion(&s->io_mmio_window, 0, &s->io_mmio); + memory_region_add_subregion(&s->io_ioport_window, 0, &s->io_ioport); + sysbus_init_mmio(sbd, &s->io_mmio_window); + sysbus_init_mmio(sbd, &s->io_ioport_window); + + for (i =3D 0; i < BCM2838_PCIE_NUM_IRQS; i++) { + sysbus_init_irq(sbd, &s->irq[i]); + s->irq_num[i] =3D -1; + } + + pci->bus =3D pci_register_root_bus(dev, "pcie.0", bcm2838_pcie_host_se= t_irq, + bcm2838_pcie_host_map_irq, s, &s->io_= mmio, + &s->io_ioport, 0, BCM2838_PCIE_NUM_IR= QS, + TYPE_PCIE_BUS); + pci_bus_set_route_irq_fn(pci->bus, bcm2838_pcie_host_route_intx_pin_to= _irq); + qdev_realize(DEVICE(&s->root_port), BUS(pci->bus), &error_fatal); +} + +static const char *bcm2838_pcie_host_root_bus_path(PCIHostState *host_brid= ge, + PCIBus *rootbus) +{ + return "0000:00"; +} + +static void bcm2838_pcie_host_class_init(ObjectClass *class, const void *d= ata) +{ + DeviceClass *dc =3D DEVICE_CLASS(class); + PCIHostBridgeClass *hc =3D PCI_HOST_BRIDGE_CLASS(class); + + hc->root_bus_path =3D bcm2838_pcie_host_root_bus_path; + dc->realize =3D bcm2838_pcie_host_realize; + set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); + dc->fw_name =3D "pci"; +} + +static void bcm2838_pcie_host_initfn(Object *obj) +{ + BCM2838PcieHostState *s =3D BCM2838_PCIE_HOST(obj); + BCM2838PcieRootState *root =3D &s->root_port; + + object_initialize_child(obj, "root_port", root, TYPE_BCM2838_PCIE_ROOT= ); + qdev_prop_set_int32(DEVICE(root), "addr", PCI_DEVFN(0, 0)); + qdev_prop_set_bit(DEVICE(root), "multifunction", false); +} + +static const TypeInfo bcm2838_pcie_host_info =3D { + .name =3D TYPE_BCM2838_PCIE_HOST, + .parent =3D TYPE_PCIE_HOST_BRIDGE, + .instance_size =3D sizeof(BCM2838PcieHostState), + .instance_init =3D bcm2838_pcie_host_initfn, + .class_init =3D bcm2838_pcie_host_class_init, +}; + /* * RC root part (D0:F0) */ @@ -77,6 +302,7 @@ static const TypeInfo bcm2838_pcie_root_info =3D { static void bcm2838_pcie_register(void) { type_register_static(&bcm2838_pcie_root_info); + type_register_static(&bcm2838_pcie_host_info); } =20 type_init(bcm2838_pcie_register) diff --git a/hw/arm/trace-events b/hw/arm/trace-events index 1b16f710fe..579d4b12c2 100644 --- a/hw/arm/trace-events +++ b/hw/arm/trace-events @@ -96,3 +96,7 @@ z2_aer915_event(int8_t event, int8_t len) "i2c event =3D0= x%x len=3D%d bytes" =20 # bcm2838.c bcm2838_gic_set_irq(int irq, int level) "gic irq:%d lvl:%d" + +# bcm2838_pcie.c +bcm2838_pcie_host_read(unsigned int size, uint64_t offset, uint64_t value)= "%u bytes @ 0x%04"PRIx64": 0x%016"PRIx64 +bcm2838_pcie_host_write(unsigned int size, uint64_t offset, uint64_t value= ) "%u bytes @ 0x%04"PRIx64": 0x%016"PRIx64 diff --git a/include/hw/arm/bcm2838_pcie.h b/include/hw/arm/bcm2838_pcie.h index fe7a6cff19..18ab04f24a 100644 --- a/include/hw/arm/bcm2838_pcie.h +++ b/include/hw/arm/bcm2838_pcie.h @@ -16,6 +16,9 @@ #include "hw/pci/pcie_port.h" #include "qom/object.h" =20 +#define TYPE_BCM2838_PCIE_HOST "bcm2838-pcie-host" +OBJECT_DECLARE_SIMPLE_TYPE(BCM2838PcieHostState, BCM2838_PCIE_HOST) + #define TYPE_BCM2838_PCIE_ROOT "bcm2838-pcie-root" OBJECT_DECLARE_TYPE(BCM2838PcieRootState, BCM2838PcieRootClass, BCM2838_PCIE_ROOT) @@ -50,4 +53,23 @@ struct BCM2838PcieRootClass { }; =20 =20 +struct BCM2838PcieHostState { + /*< private >*/ + PCIExpressHost parent_obj; + + /*< public >*/ + BCM2838PcieRootState root_port; + + MemoryRegion cfg_regs; + MemoryRegion io_ioport; + MemoryRegion io_mmio; + MemoryRegion io_ioport_window; + MemoryRegion io_mmio_window; + + qemu_irq irq[BCM2838_PCIE_NUM_IRQS]; + int irq_num[BCM2838_PCIE_NUM_IRQS]; +}; + +int bcm2838_pcie_host_set_irq_num(BCM2838PcieHostState *s, int index, int = spi); + #endif /* BCM2838_PCIE_H */ --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786458997; cv=none; d=zohomail.com; s=zohoarc; b=AqzrhyNIjQ5dnQg8cTBfoFV6SqIEqQSv6uZ1qq1TZG0s5ncf4ypHPaYiN13U6WlzviOEn3pzE7nfP5pcqbDFL++1pyvFQeT3RY0T5kIE3xu1U9+4wWgoAGWqFV2vYRYQKsUJG2OUumBvPSeMNHYSXi0Taq6ZcXgQAZiLklI44oY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786458997; 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=wpoBHHJBT7Q2HpQYj8PGJ7orlbyWW8U9PIu0a8OEoFU=; b=cMLVKSmGAhetkb+mhbh7RdS4/VX/fZQ7OT3hEu/9YcY7owdtqFqKjC4GhAlAMbVidNJZYoXNnBaEYyEDgr3cRoZWiEuxeKim7k96YoaL5vKR7j51zbhWJRswam/SsLqJ6gOZlOg9cKU4efu2uoGPBrv7qQLhDLLhxOOs82B63oo= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 178645899721652.432763379927565; Tue, 11 Aug 2026 07:36:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnaM-0000II-En; Tue, 11 Aug 2026 10:36:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaH-0000FP-4k for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:05 -0400 Received: from mail-qv1-xf34.google.com ([2607:f8b0:4864:20::f34]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaF-0001r3-A9 for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:04 -0400 Received: by mail-qv1-xf34.google.com with SMTP id 6a1803df08f44-8f1a8e914a9so26036236d6.1 for ; Tue, 11 Aug 2026 07:36:02 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.01 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458962; x=1787063762; 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:content-type; bh=wpoBHHJBT7Q2HpQYj8PGJ7orlbyWW8U9PIu0a8OEoFU=; b=BBctoIaCwL72IdB2P76JPx7Z1lwluhYSLqpL8W+KX74M3QlN3KBczali9OSaV/Ds8K tJ9I9VO7iIZhG+Dd+n7q6IEPQYm41emFLYq3SN0/nZYkeqe2QmOb9HPw6xY5sey3mvLA L323wKXG/Z+pLERf3T/v3sVMwJBSnChmFnzoILdRXdFdNjVj8RodpRRFjawaI+cdExCu POlqM0giewupghy4NcuDSSTAxcZRtDGwygcuFB10uWY67ukWQ6UXIX3Ff33+DH+zXHqG 0d3AREgzY6K5p8q4agPMdwxV+xMR0Tr1m23RbNikFMG2olGcimIEJmqg+PT1nYsuqKcQ H4tA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458962; x=1787063762; 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:content-type; bh=wpoBHHJBT7Q2HpQYj8PGJ7orlbyWW8U9PIu0a8OEoFU=; b=hFNT+jiBtDy7ub1kzzZgT6hW6Ks69PLKUQbf4JW/PZwdBkYXuxdIg9tq1ikrFSb0p/ F0Vw3E9ElOgO/qKqIIn4+NFJcst6t0IYiKHOo+hOXasILmSB4M7fyxO1JZIn8SD8Ie1O 9S302iNG64VF9KFT9IUsUDBYFjioPTL6u1C1y4u08Gy6qNJCHLumlpl+6Ep95wmJbZI8 2JL0xphJBN90fYHHMKsJ+XsCEzp4JCtyDZszQYqiv6gM1VtucKE4/yZam4qlOhDOcDSM jUdqM/StDZfc45S6365HxW0FfQoQGgL+Y869FmKJwWXLjBJd54CJaTZnCYQ/jAAGwVF7 TO4w== X-Gm-Message-State: AOJu0Yx80oV1jLpl8SrQtOQKr+mT0+X8pMLeUq9ZOMDpejB1xZBKVy/a xmlnPA7uirqac/tFxSfGHH4Q3V1NQjVCIdrwWg/n5Ry6ZtLLJFw1/uo7Mwipbg== X-Gm-Gg: AR+sD11fdfdd7p9xlGwt0z74k6Lp1+oCWqJGxRl3DAJnElhH18eHoWTj3qcgatHB+Mn uClTOUMn4ivc8oltpXQ+W+yxz/y7CkI9i9oa95LFOHUbCldov4V1oJcsLTYfepbysvMhc/1BO8D ybnPU29RaDw3M7Cus5U6FW2TkpNWAr3PGx5wXOq3L6SiTknBXAmYBFY5cKCifZx2ND7UJHwZgME Kf0++28uIYTQ7cQsOC/q/UhjGI4IMf/mjpKvXO2LCwPXvdhQlAcTIEdXxFPw/l4oqAjSPOml6/x Cwa0DzeLz0unL9FF6fYsfpChno8UQMzZEmeNbO5YwTWxSj4nQfqiF4FJxxSqCL7uHMOiOcjjxrH zAOv2pGXkftt6i4r3Zu8uqhTd8P9bI7QcWIIVkcK/TwLhH0H4BQtwIz+zooWEPzrob0GdEY+dst Mi1uRdakyG16eCFXTX0/VaZCIgqS9hicsRaDhxndVJ0xsPk0AgYsSOTGfjk5otKbdCFXa006RYi mCd0DTqLTH9ZYvw0JY= X-Received: by 2002:a05:6214:1316:b0:907:5aa8:ceb2 with SMTP id 6a1803df08f44-90a668d9ce8mr34290126d6.18.1786458962216; Tue, 11 Aug 2026 07:36:02 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 03/19] hw/arm/bcm2838: enable BCM2838 PCIe host bridge Date: Tue, 11 Aug 2026 10:35:40 -0400 Message-ID: <20260811143557.7862-4-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f34; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf34.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=ham 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: 1786458999372158500 Content-Type: text/plain; charset="utf-8" Wire the BCM2838 PCIe host bridge into the SoC's peripheral block: instantiate it, map its RC registers and MMIO window. Per Peter Maydell's review of a later follow-up series, fold in the remaining defect from what was originally a separate bugfix here, since this device isn't in upstream git yet: the PCI MMIO window was mapped at the ARM base address with no address translation, even though PCIE_MMIO_OFFSET was defined for exactly that purpose (and otherwise unused). The DTB declares CPU 0x600000000 as mapping to PCI 0xc0000000, so a guest would read PCI address 0 where it expected a device BAR. Map an alias at the correct PCI offset instead. Signed-off-by: Marcelo Manzo --- hw/arm/bcm2838.c | 9 +++++++ hw/arm/bcm2838_peripherals.c | 35 ++++++++++++++++++++++++++++ hw/arm/raspi4b.c | 1 - include/hw/arm/bcm2838_peripherals.h | 3 +++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/hw/arm/bcm2838.c b/hw/arm/bcm2838.c index 089af412a3..fc56f87934 100644 --- a/hw/arm/bcm2838.c +++ b/hw/arm/bcm2838.c @@ -230,6 +230,15 @@ static void bcm2838_realize(DeviceState *dev, Error **= errp) qdev_connect_gpio_out(dma_9_10_irq_orgate, 0, qdev_get_gpio_in(gicdev, GIC_SPI_INTERRUPT_DMA_9= _10)); =20 + /* Connect PCIe host bridge to the interrupt controller */ + for (int n =3D 0; n < BCM2838_PCIE_NUM_IRQS; n++) { + int int_n =3D GIC_SPI_INTERRUPT_PCI_INT_A + n; + sysbus_connect_irq(SYS_BUS_DEVICE(&ps->pcie_host), n, + qdev_get_gpio_in(gicdev, int_n)); + bcm2838_pcie_host_set_irq_num(BCM2838_PCIE_HOST(&ps->pcie_host), n, + int_n); + } + /* Pass through inbound GPIO lines to the GIC */ qdev_init_gpio_in(dev, bcm2838_gic_set_irq, GIC_NUM_IRQS); =20 diff --git a/hw/arm/bcm2838_peripherals.c b/hw/arm/bcm2838_peripherals.c index 812b5b8480..d923ba968a 100644 --- a/hw/arm/bcm2838_peripherals.c +++ b/hw/arm/bcm2838_peripherals.c @@ -15,6 +15,11 @@ #define CLOCK_ISP_OFFSET 0xc11000 #define CLOCK_ISP_SIZE 0x100 =20 +#define PCIE_RC_OFFSET 0x1500000 +#define PCIE_MMIO_OFFSET 0xc0000000 +#define PCIE_MMIO_ARM_OFFSET 0x600000000 +#define PCIE_MMIO_SIZE 0x40000000 + /* Lower peripheral base address on the VC (GPU) system bus */ #define BCM2838_VC_PERI_LOW_BASE 0x7c000000 =20 @@ -35,6 +40,10 @@ static void bcm2838_peripherals_init(Object *obj) /* Extended Mass Media Controller 2 */ object_initialize_child(obj, "emmc2", &s->emmc2, TYPE_SYSBUS_SDHCI); =20 + /* PCIe Host Bridge */ + object_initialize_child(obj, "pcie-host", &s->pcie_host, + TYPE_BCM2838_PCIE_HOST); + /* GPIO */ object_initialize_child(obj, "gpio", &s->gpio, TYPE_BCM2838_GPIO); =20 @@ -67,6 +76,8 @@ static void bcm2838_peripherals_realize(DeviceState *dev,= Error **errp) MemoryRegion *mphi_mr; BCM2838PeripheralState *s =3D BCM2838_PERIPHERALS(dev); BCMSocPeripheralBaseState *s_base =3D BCM_SOC_PERIPHERALS_BASE(dev); + MemoryRegion *regs_mr; + MemoryRegion *mmio_mr; int n; =20 bcm_soc_peripherals_common_realize(dev, errp); @@ -182,6 +193,30 @@ static void bcm2838_peripherals_realize(DeviceState *d= ev, Error **errp) create_unimp(s_base, &s->clkisp, "bcm2835-clkisp", CLOCK_ISP_OFFSET, CLOCK_ISP_SIZE); =20 + /* PCIe Root Complex */ + if (!sysbus_realize(SYS_BUS_DEVICE(&s->pcie_host), errp)) { + return; + } + /* RC registers region */ + regs_mr =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->pcie_host), 0); + memory_region_add_subregion(&s->peri_low_mr, PCIE_RC_OFFSET, regs_mr); + /* + * MMIO region. + * + * The BCM2711 PCIe controller translates addresses between the ARM and + * PCI address spaces: the DTB declares CPU 0x600000000 as mapping to = PCI + * 0xc0000000. Map an alias of the PCI window starting at that PCI off= set + * so accesses land on the right addresses; mapping the window directly + * would expose PCI address 0 at the ARM base instead, and every BAR + * behind the root port would be read at the wrong address. + */ + mmio_mr =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->pcie_host), 1); + memory_region_init_alias(&s->pcie_mmio_alias, OBJECT(s), + "bcm2838_pcie_mmio_alias", mmio_mr, + PCIE_MMIO_OFFSET, PCIE_MMIO_SIZE); + memory_region_add_subregion(get_system_memory(), PCIE_MMIO_ARM_OFFSET, + &s->pcie_mmio_alias); + /* GPIO */ if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) { return; diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c index 06aeb8db01..038eefb234 100644 --- a/hw/arm/raspi4b.c +++ b/hw/arm/raspi4b.c @@ -64,7 +64,6 @@ static void raspi4_modify_dtb(const struct arm_boot_info = *info, void *fdt) =20 /* Temporarily disable following devices until they are implemented */ const char *nodes_to_remove[] =3D { - "brcm,bcm2711-pcie", "brcm,bcm2711-rng200", "brcm,bcm2711-thermal", "brcm,bcm2711-genet-v5", diff --git a/include/hw/arm/bcm2838_peripherals.h b/include/hw/arm/bcm2838_= peripherals.h index 0be97e67c7..7fe92789e8 100644 --- a/include/hw/arm/bcm2838_peripherals.h +++ b/include/hw/arm/bcm2838_peripherals.h @@ -10,6 +10,7 @@ #define BCM2838_PERIPHERALS_H =20 #include "hw/arm/bcm2835_peripherals.h" +#include "hw/arm/bcm2838_pcie.h" #include "hw/sd/sdhci.h" #include "hw/gpio/bcm2838_gpio.h" =20 @@ -65,6 +66,8 @@ struct BCM2838PeripheralState { MemoryRegion mphi_mr_alias; =20 SDHCIState emmc2; + MemoryRegion pcie_mmio_alias; + BCM2838PcieHostState pcie_host; BCM2838GpioState gpio; =20 OrIRQState mmc_irq_orgate; --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459037; cv=none; d=zohomail.com; s=zohoarc; b=Hc5i77Bqg/rWGS2X9iAMSWaU1ujEcE75cn11cc0BFIAno++S0vsDWvbDyC5FC8Q7WfddrmqCwhnXhI80zLlcmkdyagErH06jYttbr0WW0ew4X4nRqKFmTGpu+3N8E/LkIMp4cujyagoCGTHjfne6JmZsQilz9IzJXC/UwcymzHg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459037; 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=xUCaDY/np0WAstzilj/aRxu/YjTtEwlLG0s9zckn39E=; b=Hu2WoZhsstLgts8BDRpaIEbuntwgVqlVAKFxH0u4K3FEEeBz6bYgQ2uEXj/OAinpMj22rsh/w/4bTAs4JFbIVLBd9Ch1G2nxao4xHFvZCAzX6yS2u35ELSgxam3YekSzqqNTUmI6BwtuNM77C3CwTbEWSFa7VTG8c2di/x9nrp0= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459037071465.1697345261259; Tue, 11 Aug 2026 07:37:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnaZ-0000M7-KA; Tue, 11 Aug 2026 10:36:25 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaI-0000HF-Rm for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:06 -0400 Received: from mail-qt1-x832.google.com ([2607:f8b0:4864:20::832]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaG-0001rV-EV for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:06 -0400 Received: by mail-qt1-x832.google.com with SMTP id d75a77b69052e-51c0cea8883so8898141cf.1 for ; Tue, 11 Aug 2026 07:36:04 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.02 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458963; x=1787063763; 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:content-type; bh=xUCaDY/np0WAstzilj/aRxu/YjTtEwlLG0s9zckn39E=; b=Wk6qyPE7//WuTKp7itmwKCectCLrzx0MdfVuIJadfUj6RB6b/zW1ma3rhRPiH/0IyL AubL6P4BVfXGigE6jgHBAqlSip13CVXMVJh7QeAuyuEQ3kuHBwm4/JrFOH1+LBf5AYf9 dF/crBU5ao8A6giq8iDr/gIbnNeDO9dcKAuv6vPaIIgqk1icRyIQ1hQLxk4vql8Mu/XZ aY1wzHHLvYYAcrQMoJWkBGdRcX0oIxKUNA07iAb5BL2v1Bq7VMfu1Mw+svtEf2f4G+Xe JZ50FyjRwieTdhGo4zM2ASm/6yaBMLRIzsyg1Re/Nlmlo+ZcgCwlYVli5u1hVy5lJMaF H8/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458963; x=1787063763; 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:content-type; bh=xUCaDY/np0WAstzilj/aRxu/YjTtEwlLG0s9zckn39E=; b=jdzDj94q4nR9EEfBNbJnJ22TTT59hOweDD0XGGRIswxyeJK7lSYV8cWmsEPlkd5qLX nN5wp15m9VO6hbSyQsLHllpoehAhGpzK5q1Cxl9Xn2AxUo/WUA8PWze5qBYW4qudbxDG xmeS0kKiTJF2QmNWwv/hnvMCKG1T5fLAKQdTesqsBCbjGuVx4SZLsPJ31dzoQlpXQwoe kOxASxNzS2/w20O4s8Cnx6ITNfXuAyc8QIvtrx3fXPHQYovDptFKpBSpZZZSLUc7pH4K 6MBg5+JicL7XtUERSGTg5AJ38iFNrj1CIaPwHZo1X5XRypATpOvKywYshq0xPAEWbPYy nP6Q== X-Gm-Message-State: AOJu0YxktSEObQtsSdqjH4gOhefk+uRD8tsU6HMxdG73vHmdtTtWaaf1 aehpotQEK23tVEXTLKQOno7ym8P9+mnAZHdLf/Kaxfwkt0mE694yx2UffPoFvg== X-Gm-Gg: AR+sD13MD2hsTwRa2EiTMQBVZpLMx19PYkIwHxIyniV8gY0a4CxTp6tc6/hbJQWHheh fPIEpyPGdVcDCkj/wfn6RT5aoWd1RNR+jCHsmRJXXviHAaioBWEqCh18TSfSMUsTxoQt5oRK0J2 J44F4m/J7Bs2l9JBvmdtJgW1LFQIoGaqFVblCk0OoCbi5aCc5QIEAK0pazehl8ZMDlqu2SDF1Rd v6BSFPlZlUF0vsWAtHneTKSsl15tSvh3CnMu66lL4RzrKFXLlT3Kwn7DTgna5P6IWX2nVoyHCZu 8uoi1xH+agGct8TgVc9lc9oah25fxwMtGZVj4zwGdiy5wXB5ecn57xLI0dyThHmeRUFGYaIjLi5 zl6Lp0wmn7nkSOtjmhUgx9INKJ8zVUCpUR4odQRjW+vJeGxU+++zatqLhJDbRSqbnX/CDwt3ZfR J/FkbiYWX48m2sJi00wqHvv3wl8BcmKTzt5Epu7Z39cz/Q+NhTmqRR6zrPrlcobTLsLHlGbmyNS 4dfX4qok58Wznnkq5w= X-Received: by 2002:ac8:7dc1:0:b0:52d:3483:ed0a with SMTP id d75a77b69052e-52d6030e1femr5395411cf.18.1786458963329; Tue, 11 Aug 2026 07:36:03 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 04/19] hw/net/bcm2838_genet: add GENET stub device Date: Tue, 11 Aug 2026 10:35:41 -0400 Message-ID: <20260811143557.7862-5-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::832; envelope-from=marcelomanzo@gmail.com; helo=mail-qt1-x832.google.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.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, FORGED_GMAIL_RCVD=1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: 1786459039440158500 Content-Type: text/plain; charset="utf-8" Add a bare-bones BCM2838 GENET (Gigabit Ethernet) sysbus device: MMIO region registration, an out-of-range read/write handler that just logs, and a reset callback. No register-level behavior yet; that comes in the following patches. Adapted from patch 19/41 of Sergey Kambalin's Raspberry Pi 4B series (patchwork series 829638) against current QEMU master. The reset callback and class_init() use the current Resettable-phases API (ResettableClass / resettable_class_set_parent_phases()) rather than the plain DeviceClass::reset hook the original patch used, and headers moved under hw/core/, both API changes since the series was originally posted. Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 103 +++++++++++++++++++++++++++ hw/net/meson.build | 2 + hw/net/trace-events | 16 +++++ include/hw/arm/bcm2838_peripherals.h | 2 + include/hw/net/bcm2838_genet.h | 40 +++++++++++ 5 files changed, 163 insertions(+) create mode 100644 hw/net/bcm2838_genet.c create mode 100644 include/hw/net/bcm2838_genet.h diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c new file mode 100644 index 0000000000..2ff93a3417 --- /dev/null +++ b/hw/net/bcm2838_genet.c @@ -0,0 +1,103 @@ +/* + * BCM2838 Gigabit Ethernet emulation + * + * Copyright (C) 2022 Ovchinnikov Vitalii + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/module.h" +#include "qemu/log.h" +#include "qemu/error-report.h" +#include "net/eth.h" +#include "qapi/error.h" +#include "hw/core/irq.h" +#include "net/checksum.h" +#include "system/dma.h" +#include "hw/core/resettable.h" +#include "hw/net/bcm2838_genet.h" +#include "trace.h" + + +static uint64_t bcm2838_genet_read(void *opaque, hwaddr offset, unsigned s= ize) +{ + uint64_t value =3D ~0; + + qemu_log_mask( + LOG_GUEST_ERROR, + "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", + __func__, size, offset); + + trace_bcm2838_genet_read(size, offset, value); + return value; +} + +static void bcm2838_genet_write(void *opaque, hwaddr offset, uint64_t valu= e, + unsigned size) { + qemu_log_mask( + LOG_GUEST_ERROR, + "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", + __func__, size, offset); +} + +static const MemoryRegionOps bcm2838_genet_ops =3D { + .read =3D bcm2838_genet_read, + .write =3D bcm2838_genet_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .impl =3D {.max_access_size =3D 4}, + .valid =3D {.min_access_size =3D 4}, +}; + + +static void bcm2838_genet_realize(DeviceState *dev, Error **errp) +{ + BCM2838GenetState *s =3D BCM2838_GENET(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + + /* Controller registers */ + memory_region_init_io(&s->regs_mr, OBJECT(s), &bcm2838_genet_ops, s, + "bcm2838_genet_regs", sizeof(s->regs)); + sysbus_init_mmio(sbd, &s->regs_mr); +} + +static void bcm2838_genet_phy_reset(BCM2838GenetState *s) +{ + trace_bcm2838_genet_phy_reset("done"); +} + +static void bcm2838_genet_reset(Object *obj, ResetType type) +{ + BCM2838GenetState *s =3D BCM2838_GENET(obj); + + memset(&s->regs, 0x00, sizeof(s->regs)); + + trace_bcm2838_genet_reset("done"); + + bcm2838_genet_phy_reset(s); +} + +static void bcm2838_genet_class_init(ObjectClass *class, const void *data) +{ + static ResettablePhases unused_parent_phases; + DeviceClass *dc =3D DEVICE_CLASS(class); + ResettableClass *rc =3D RESETTABLE_CLASS(class); + + dc->realize =3D bcm2838_genet_realize; + resettable_class_set_parent_phases(rc, NULL, bcm2838_genet_reset, NULL, + &unused_parent_phases); +} + +static const TypeInfo bcm2838_genet_info =3D { + .name =3D TYPE_BCM2838_GENET, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(BCM2838GenetState), + .class_init =3D bcm2838_genet_class_init, +}; + +static void bcm2838_genet_register(void) +{ + type_register_static(&bcm2838_genet_info); +} + +type_init(bcm2838_genet_register) diff --git a/hw/net/meson.build b/hw/net/meson.build index 84f142df22..e290e1796b 100644 --- a/hw/net/meson.build +++ b/hw/net/meson.build @@ -69,4 +69,6 @@ system_ss.add(when: 'CONFIG_ROCKER', if_true: files( stub_ss.add(files('rocker/rocker-stubs.c')) system_ss.add(files('rocker/rocker-hmp-cmds.c')) =20 +system_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2838_genet.c')) + subdir('can') diff --git a/hw/net/trace-events b/hw/net/trace-events index 001a20b0e2..2dde33e892 100644 --- a/hw/net/trace-events +++ b/hw/net/trace-events @@ -528,3 +528,19 @@ xen_netdev_rx(int dev, int idx, int status, int flags)= "vif%u idx %d status %d f ethlite_pkt_lost(uint32_t rx_ctrl) "rx_ctrl:0x%" PRIx32 ethlite_pkt_size_too_big(uint64_t size) "size:0x%" PRIx64 ethlite_pkt_tx_size_too_big(uint64_t size) "size:0x%" PRIx64 +# bcm2838_genet.c +bcm2838_genet_read(unsigned int size, uint64_t offset, uint64_t value) "%u= bytes @ 0x%04" PRIx64 ": 0x%016" PRIx64 +bcm2838_genet_write(unsigned int size, uint64_t offset, uint64_t value) "%= u bytes @ 0x%04" PRIx64 ": 0x%016" PRIx64 +bcm2838_genet_can_receive(const char *state) "receive is %s" +bcm2838_genet_receive(ssize_t bytes_received) "%zd bytes received" +bcm2838_genet_phy_update_link(const char *link_state) "link is %s" +bcm2838_genet_phy_reset(const char *status) "PHY reset %s" +bcm2838_genet_reset(const char *status) "MAC reset %s" +bcm2838_genet_mac_address(const char *info) "%s" +bcm2838_genet_tx_dma(const char *dma_state) "TX DMA %s" +bcm2838_genet_tx_dma_ring(uint32_t ring_en) "TX DMA enabled rings: 0x%05x" +bcm2838_genet_tx_dma_ring_buf(uint32_t ring_buf_en) "TX DMA enabled ring b= uffers: 0x%05x" +bcm2838_genet_tx_dma_ring_active(unsigned int ring, const char *ring_state= ) "ring %u is %s" +bcm2838_genet_tx_request(unsigned int ring_idx, uint32_t prod_idx, uint32_= t cons_idx) "ring %u, PROD_INDEX %u, CONS_INDEX %u" +bcm2838_genet_tx(unsigned int ring_idx, uint64_t desc_idx, uint32_t desc_s= tatus, uint64_t data_addr) "ring %u, descriptor %" PRIu64 ": 0x%08x, data @= 0x%08" PRIx64 +bcm2838_genet_rx_dma_ring_active(unsigned int ring, const char *ring_state= ) "ring %u is %s" diff --git a/include/hw/arm/bcm2838_peripherals.h b/include/hw/arm/bcm2838_= peripherals.h index 7fe92789e8..2a4307bed7 100644 --- a/include/hw/arm/bcm2838_peripherals.h +++ b/include/hw/arm/bcm2838_peripherals.h @@ -52,6 +52,8 @@ #define BCM2838_MPHI_OFFSET 0xb200 #define BCM2838_MPHI_SIZE 0x200 =20 +#define GENET_OFFSET 0x1580000 + #define TYPE_BCM2838_PERIPHERALS "bcm2838-peripherals" OBJECT_DECLARE_TYPE(BCM2838PeripheralState, BCM2838PeripheralClass, BCM2838_PERIPHERALS) diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h new file mode 100644 index 0000000000..91cf1773d5 --- /dev/null +++ b/include/hw/net/bcm2838_genet.h @@ -0,0 +1,40 @@ +/* + * BCM2838 Gigabit Ethernet emulation + * + * Copyright (C) 2022 Ovchinnikov Vitalii + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef BCM2838_GENET_H +#define BCM2838_GENET_H + +#include "net/net.h" +#include "hw/core/sysbus.h" + +#define TYPE_BCM2838_GENET "bcm2838-genet" +OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_GENET) + +#define BCM2838_GENET_REV_MAJOR 6 +#define BCM2838_GENET_REV_MINOR 0 + +typedef struct { + uint8_t stub_area[0x10000]; /* temporary stub */ +} BCM2838GenetRegs; + +struct BCM2838GenetState { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + + MemoryRegion regs_mr; + AddressSpace dma_as; + + BCM2838GenetRegs regs; + + qemu_irq irq_default; + qemu_irq irq_prio; +}; + +#endif /* BCM2838_GENET_H */ --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459106; cv=none; d=zohomail.com; s=zohoarc; b=lYK2BWQUpCV3sVkYkpKJz1sx79yizcYJNIQY3GA8xwFESJByTm4Iy9pT0KrC/1sBecdoRpDlFDUv2IvYK8RzQnxwREsGxMkuJdNsHtaY9BlzZY/QOT6PLOP7OuhS6j+zhJMRk/e8RhUfsuE++DNeWoIQXhE76917mQ8wmPICILY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459106; 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=zpSRcEvnq+BmsAIlkLLSnlEtom+iVDnXoYuMZfKwtno=; b=dXG7EC3Wni8c5JtBUYdyhFSYh7lcqxoRMYHrCd1jqMcHbLyDZxmxURuR/H+5eMTR0jjXK6LTrm9LUoj+IUHghTKGCZVDsRoTyT6RYFtycXtccUV0EalMa1Vf6T8mQyqUE2fqab3gbh4vw2bxEFiLp/uBjY9Li+ZpAhkRzB9tAGw= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459106675840.7694324464441; Tue, 11 Aug 2026 07:38:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnan-0000j1-4b; Tue, 11 Aug 2026 10:36:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaJ-0000Hd-IA for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:07 -0400 Received: from mail-qv1-xf31.google.com ([2607:f8b0:4864:20::f31]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaH-0001rn-LY for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:07 -0400 Received: by mail-qv1-xf31.google.com with SMTP id 6a1803df08f44-902fc790cd5so5349046d6.1 for ; Tue, 11 Aug 2026 07:36:05 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.03 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458964; x=1787063764; 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:content-type; bh=zpSRcEvnq+BmsAIlkLLSnlEtom+iVDnXoYuMZfKwtno=; b=QgUWkJuo/G++rSLBsMqc/FLSxiyMQdM+ckLhOfU/BGfIGT2ZAYqsXRNWw9dRqRulVJ dZf1Y14fNh/ucXjR7fjXCQ9R1jyOGoCYKM90/AbbxIKzbCj1kWBv0XXBLJ0ABid+4Fyo NCd7UBQ2Wc3p8OOo7vtXUTlDQLIf5CE3063rL3c8OFYDat9wTzVgdM8unziVAGxaPmTI iCef+6umfxVhzKlHZcTdUFL56BJnnnORCiG6cIjpBhAEJlcE9Ikl99vXUJ8EzqUHhttM Ot9cmHlGm85xRMCfffXLHy+zJL9XQnXUohbELhmmLLjWghfYZi7LHgNpSHG5GnbDkmcZ lsfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458964; x=1787063764; 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:content-type; bh=zpSRcEvnq+BmsAIlkLLSnlEtom+iVDnXoYuMZfKwtno=; b=TNXz42PD68RYNX6VkEYBQXyJi/iFRGQcLm78qnT60/CG/S8myXGTa1Skh0eAxU/ALV MV2PbVhTjnlnrYnvB+/44MNs20v/7CI//HuZ+vlL8zyPEGRgJ+b3Rmp+dK3O0+oEirMT SxSPiOMugx+AFt3WSEcOtMYHFFAp3yc08PLYG20aVAw0mCxaQgI1vMNVp5sRxDrw/LED AhK3MM6+4S18IgZRe4xTu/6x0QlTcLP82uxJgOG7bpY6QiV1Jnd2GedGNZAKUTXqDTrW n7DDrYyjLXW+PR2VUZ3aT9/KD8jgVDGqABaj2yHFdRJu36ja59u+4A+RDoB0FkcwFR+y V7xw== X-Gm-Message-State: AOJu0YykYgFLErt04nn9u1i6LEhP8DqtpYbqbNE4c51otKhrE/x8CVRO OvNheYtrhThB452JqT6WsI3Rz/5IIAKEIeVj14R9Wixak9a14jHlp74Js10kBw== X-Gm-Gg: AR+sD13M7hQ4OZ66Zc5h7B8sB40hhaJclUTKIcqEo326ldFp66SdN9XOGtUD573T7V3 gpn5NkrCjnZDJHFAu0tqeXnDN9A+hMrlJUOoLrwfKzkP/8LWxduVv/Ind5TNXP1qs9HdRcDwoS5 5ROjnanzNNRP42T+/LV/fSH32X2CCYZM08J2fQQch1XRhxR2r2dexx/txoIl/CpRVszOL9SuJK9 Q40OxlOWjMD5PDUulzpW1NlCjwybS10QzhgLALPq3J9spfRi0G00GNZ3MTiR7uerxCgNQJBxe8h HTxMMljauyId80s7FKpH3NEbjglvc9vObmfBL86FFNeh2bqxgb3T9NRuGW9VXsPfOM/BgNdCx/V vpPSaXimmeRRx5aC4wUdLPXRlqyANgvHdbF3YbmE8OknE+2L2ojucoRpc+heML9M9FoAOXejLwI PbFvUSvUIUdj/SSgzjljzDW7FAx6WNEK2Ljaa74KNFFxZUei4kFrf4P0pklCSYh4NscihWyx12H 4G2W/fZ/t6eN1tVfWwIabYwAxHLjg== X-Received: by 2002:a05:6214:40a:b0:8cc:d29:9f78 with SMTP id 6a1803df08f44-90a6c0ee9d6mr3772446d6.11.1786458964309; Tue, 11 Aug 2026 07:36:04 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 05/19] hw/net/bcm2838_genet: add GENET register structs, part 1/4 Date: Tue, 11 Aug 2026 10:35:42 -0400 Message-ID: <20260811143557.7862-6-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f31; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf31.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=ham 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: 1786459107987158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Add the SYS, GR_BRIDGE, EXT, INTRL0, and INTRL1 register block layouts and the top-level BCM2838GenetRegs/BCM2838GenetState structs, plus REG32/FIELD accessors for the revision-control and interrupt-status registers. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 37 ++++++++++++++++ include/hw/net/bcm2838_genet.h | 77 +++++++++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 2ff93a3417..ff6602c1f3 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -15,10 +15,47 @@ #include "hw/core/irq.h" #include "net/checksum.h" #include "system/dma.h" +#include "hw/core/registerfields.h" #include "hw/core/resettable.h" #include "hw/net/bcm2838_genet.h" #include "trace.h" =20 +REG32(GENET_SYS_REV_CTRL, 0) +FIELD(GENET_SYS_REV_CTRL, GPHY_REV, 0, 16) +FIELD(GENET_SYS_REV_CTRL, MINOR_REV, 16, 4) +FIELD(GENET_SYS_REV_CTRL, RSVD_20_23, 20, 4) +FIELD(GENET_SYS_REV_CTRL, MAJOR_REV, 24, 4) +FIELD(GENET_SYS_REV_CTRL, RSVD_28_31, 28, 4) + +REG32(GENET_INTRL_0, 0) +FIELD(GENET_INTRL_0, SCB, 0, 1) +FIELD(GENET_INTRL_0, EPHY, 1, 1) +FIELD(GENET_INTRL_0, PHY_DET_R, 2, 1) +FIELD(GENET_INTRL_0, PHY_DET_F, 3, 1) +FIELD(GENET_INTRL_0, LINK_UP, 4, 1) +FIELD(GENET_INTRL_0, LINK_DOWN, 5, 1) +FIELD(GENET_INTRL_0, UMAC, 6, 1) +FIELD(GENET_INTRL_0, UMAC_TSV, 7, 1) +FIELD(GENET_INTRL_0, TBUF_UNDERRUN, 8, 1) +FIELD(GENET_INTRL_0, RBUF_OVERFLOW, 9, 1) +FIELD(GENET_INTRL_0, HFB_SM, 10, 1) +FIELD(GENET_INTRL_0, HFB_MM, 11, 1) +FIELD(GENET_INTRL_0, MPD_R, 12, 1) +FIELD(GENET_INTRL_0, RXDMA_MBDONE, 13, 1) +FIELD(GENET_INTRL_0, RXDMA_PDONE, 14, 1) +FIELD(GENET_INTRL_0, RXDMA_BDONE, 15, 1) +FIELD(GENET_INTRL_0, TXDMA_MBDONE, 16, 1) +FIELD(GENET_INTRL_0, TXDMA_PDONE, 17, 1) +FIELD(GENET_INTRL_0, TXDMA_BDONE, 18, 1) +FIELD(GENET_INTRL_0, RSVD_19_22, 19, 4) +FIELD(GENET_INTRL_0, MDIO_DONE, 23, 1) +FIELD(GENET_INTRL_0, MDIO_ERROR, 24, 1) +FIELD(GENET_INTRL_0, RSVD_25_31, 25, 4) + +REG32(GENET_INTRL_1, 0) +FIELD(GENET_INTRL_1, TX_INTRS, 0, 16) +FIELD(GENET_INTRL_1, RX_INTRS, 16, 16) + =20 static uint64_t bcm2838_genet_read(void *opaque, hwaddr offset, unsigned s= ize) { diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index 91cf1773d5..af5e8abd2e 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -19,7 +19,82 @@ OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_GE= NET) #define BCM2838_GENET_REV_MINOR 0 =20 typedef struct { - uint8_t stub_area[0x10000]; /* temporary stub */ + uint32_t rev_ctrl; + uint32_t port_ctrl; + uint32_t rbuf_flush_ctrl; + uint32_t tbuf_flush_ctrl; + uint32_t reserved_0x10[12]; +} BCM2838GenetRegsSys; + +typedef struct { + uint32_t reserved_0x0[16]; +} BCM2838GenetRegsGrBridge; + +typedef struct { + uint32_t pwr_mgmt; + uint32_t reserved_0x4[2]; + uint32_t rgmii_oob_ctrl; + uint32_t reserved_0x10[3]; + uint32_t gphy_ctrl; + uint32_t reserved_0x20[24]; +} BCM2838GenetRegsExt; + +typedef struct { + uint32_t stat; + uint32_t set; + uint32_t clear; + uint32_t mask_status; + uint32_t mask_set; + uint32_t mask_clear; + uint32_t reserved_0x18[10]; +} BCM2838GenetRegsIntrl0; + +typedef struct { + uint32_t stat; + uint32_t set; + uint32_t clear; + uint32_t mask_status; + uint32_t mask_set; + uint32_t mask_clear; + uint32_t reserved_0x18[10]; +} BCM2838GenetRegsIntrl1; + +typedef struct { + uint32_t ctrl; + uint32_t reserved_0x4[2]; + uint32_t status; + uint32_t reserved_0x10; + uint32_t chk_ctrl; + uint32_t reserved_0x18[31]; + uint32_t ovfl_cnt; + uint32_t err_cnt; + uint32_t energy_ctrl; + uint32_t reserved_0xA0[5]; + uint32_t size_ctrl; + uint32_t reserved_0xB8[18]; +} BCM2838GenetRegsRbuf; + +typedef struct { + uint32_t ctrl; + uint32_t reserved_0x4[2]; + uint32_t bp_mc; + uint32_t reserved_0x10; + uint32_t energy_ctrl; + uint32_t reserved_0x18[58]; +} BCM2838GenetRegsTbuf; + +typedef struct { + BCM2838GenetRegsSys sys; + BCM2838GenetRegsGrBridge gr_bridge; + BCM2838GenetRegsExt ext; + uint32_t reserved_0x100[64]; + BCM2838GenetRegsIntrl0 intrl0; + BCM2838GenetRegsIntrl1 intrl1; + uint32_t reserved_0x280[32]; + BCM2838GenetRegsRbuf rbuf; + uint32_t reserved_0x400[128]; + BCM2838GenetRegsTbuf tbuf; + uint32_t reserved_0x700[64]; } BCM2838GenetRegs; =20 struct BCM2838GenetState { --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459104; cv=none; d=zohomail.com; s=zohoarc; b=B7Mp7Su514QW7GzX75EVLjnB2MDoYAwRW1xxbnt8ZZcy/i42PMXAbnta6wY71HkCkHf/7JINNNjvZt1G6OPB/yOUM7JW3wrL7PA6cTS0ljowjjndW3i1v5tFxrP0IKSC5BvwodZCSUVsxfl4XHXPlSrATrZaamPQMvlecbzTKyM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459104; 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=WlIdT+++GefDgwf/oPOrATEEFm3yCmvPpjzJoY2W/r0=; b=mq0Z8WS7v5Ak1HpKHnMPg3J2oor98XNKaMcQvV+kLo47YY5S4beXi6inAZASMNEOeHfheHPvwrSes7uR79c/TXLoBQeYFLFknB9qHa0cDxZljrPQDsoWDgoXn716dWdoYAjwFUdCfra7BvhN2RagszFPclhs8fVnhtWXp6P5hMw= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459104663819.5743930339605; Tue, 11 Aug 2026 07:38:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnam-0000bj-Ha; Tue, 11 Aug 2026 10:36:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaK-0000IL-Ly for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:10 -0400 Received: from mail-qv1-xf35.google.com ([2607:f8b0:4864:20::f35]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaI-0001sS-Ld for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:08 -0400 Received: by mail-qv1-xf35.google.com with SMTP id 6a1803df08f44-8f29ec73064so17586896d6.1 for ; Tue, 11 Aug 2026 07:36:06 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.04 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458966; x=1787063766; 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:content-type; bh=WlIdT+++GefDgwf/oPOrATEEFm3yCmvPpjzJoY2W/r0=; b=pyTDLIzcRGNquxPOTi/27ZwvtWAmTsLBKeZ5HIzGvjLyHGnT0FK9qnEwTLYX1zc0Xb OLyMb2so9+ySikpygjw9vXi5DxAQARGaO4eTduMj2WhSDa49E/mBlUlHWFFdQt3DsxuW 8Ckw0Qu/Ho44rDMVs12nm8xeofWhqiPfhqpBnq4ZXdl7AmS9+YLipScWKP+oj/jysjk6 e/2vkJCYsztWXhahxi9Le2pbFk0PS7a8UdBzkudzScHQFajpxnaYm3ncLRsIzkAYc8me CdEIJY/YAAa4L859/HzS3e88jsfeFMaR6BAzqUZJm9705E9Vuxx/+iq9uVIaOlclebLT MykA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458966; x=1787063766; 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:content-type; bh=WlIdT+++GefDgwf/oPOrATEEFm3yCmvPpjzJoY2W/r0=; b=hs7ghTk3oxjqQvlfYM6HtPpH1d7/rXvqhtmaMejKCfWRx4YL6UTQIA1QygA6ZSzvdS MjsfCKbaOQAwCmMav+GjDQRoqzrU/hI3LebEilbQOdlcOd9uFSiiCAR/bQkgBLYp7jm2 cprd6MsVhjAGwjzTu6TfDRuOdDqNb7wV4Y/jhSNCS1pjRGrGdcH9WhwWeI2/kF9c9boR 58LKveCLsGMOdLgvl5UI2Mr6rxggnWZz+gai3RlpqEpWP2/lyoFopyMxVAGkbtTzvHUD K0xcbSJF6U42wIFo/EoWBXoi6VG5UHWkJD3dV/K4cN+W40W7koC3iS2towaol4MLhX2G SMbw== X-Gm-Message-State: AOJu0Yxpb1GUmTPv2kPNNHyaw9KqdIhN5jUxjBMVAUUERnOA0BjVayQW /cYDyuMPZm/2pJi7QXex9J+8u4UeQ2iEBr/ziyDeoAxVHPCK8bgsiKVQ02pncQ== X-Gm-Gg: AR+sD13FKOUow6Vq/zZsw8Ty8IPZElmHK2919uiAC0fpiz2wVbxcUyC3rh+Zp2AZ6JX 1A9Tf9k9RJmb7IqBZsqLdG0vW35A8sfP1kXPOPgrT6Ss0Y3pYAQt23LNQ0rYF+PrifOnRQFu377 iwG7ZMTpR0hIQPmutuis4Uko8MtlssCTg+Ug0hrK1rxYBTIlps8C1yADcPwFJbx0NoZbtnN5dJF 9F5BrDoi6YfbIsUNDG/XJMxfY0EMtntG+cDdEO5UPNb39qopNnYDUkn0dRCgBU28Z8Fjv3xx17o g0/HCC3bjE+vHbKxrRNCq6BOVXfE6+iH++9fLxWT1epWGUlKEZ0t80NAFiyrMcjftQRY60i6g1K yRhajT5zIptNRrVwsKSUg/wqWRz2xzReoWfSvbesvTmzQA09rZCti7Xzm/+eTd5vOHt/7sU4txD +Svn6D9LDZdFixdisMA9AwbLqZN6hLNXtiYjzGC9u7jT0b++MqIBlxfzpkyog7QX1qxZPKM1fgk 86kPjubMHBFXXz1/p5+LagPc1OKCA== X-Received: by 2002:a05:6214:2f8b:b0:907:c6bb:5ce4 with SMTP id 6a1803df08f44-90a66b6d2c6mr36891006d6.32.1786458965557; Tue, 11 Aug 2026 07:36:05 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 06/19] hw/net/bcm2838_genet: add GENET register structs, part 2/4 Date: Tue, 11 Aug 2026 10:35:43 -0400 Message-ID: <20260811143557.7862-7-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f35; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf35.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=ham 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: 1786459105859158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Add the UMAC (CMD, MAC address, MDIO command) and DMA (ring config, control, producer/consumer index, status, RX descriptor length/status) register layouts and their field accessors. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 91 ++++++++++++++++++++++++++++++++++ include/hw/net/bcm2838_genet.h | 89 +++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index ff6602c1f3..12a80534fb 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -20,6 +20,7 @@ #include "hw/net/bcm2838_genet.h" #include "trace.h" =20 +/* GENET layouts */ REG32(GENET_SYS_REV_CTRL, 0) FIELD(GENET_SYS_REV_CTRL, GPHY_REV, 0, 16) FIELD(GENET_SYS_REV_CTRL, MINOR_REV, 16, 4) @@ -56,6 +57,96 @@ REG32(GENET_INTRL_1, 0) FIELD(GENET_INTRL_1, TX_INTRS, 0, 16) FIELD(GENET_INTRL_1, RX_INTRS, 16, 16) =20 +REG32(GENET_UMAC_CMD, 0) +FIELD(GENET_UMAC_CMD, TX_EN, 0, 1) +FIELD(GENET_UMAC_CMD, RX_EN, 1, 1) +FIELD(GENET_UMAC_CMD, SPEED, 2, 2) +FIELD(GENET_UMAC_CMD, PROMISC, 4, 1) +FIELD(GENET_UMAC_CMD, PAD_EN, 5, 1) +FIELD(GENET_UMAC_CMD, CRC_FWD, 6, 1) +FIELD(GENET_UMAC_CMD, PAUSE_FWD, 7, 1) +FIELD(GENET_UMAC_CMD, RX_PAUSE_IGNORE, 8, 1) +FIELD(GENET_UMAC_CMD, TX_ADDR_INS, 9, 1) +FIELD(GENET_UMAC_CMD, HD_EN, 10, 1) +FIELD(GENET_UMAC_CMD, SW_RESET_OLD, 11, 1) +FIELD(GENET_UMAC_CMD, RSVD_12, 12, 1) +FIELD(GENET_UMAC_CMD, SW_RESET, 13, 1) +FIELD(GENET_UMAC_CMD, RSVD_14, 14, 1) +FIELD(GENET_UMAC_CMD, LCL_LOOP_EN, 15, 1) +FIELD(GENET_UMAC_CMD, RSVD_16_21, 16, 6) +FIELD(GENET_UMAC_CMD, AUTO_CONFIG, 22, 1) +FIELD(GENET_UMAC_CMD, CNTL_FRM_EN, 23, 1) +FIELD(GENET_UMAC_CMD, NO_LEN_CHK, 24, 1) +FIELD(GENET_UMAC_CMD, RMT_LOOP_EN, 25, 1) +FIELD(GENET_UMAC_CMD, RX_ERR_DISC, 26, 1) +FIELD(GENET_UMAC_CMD, PRBL_EN, 27, 1) +FIELD(GENET_UMAC_CMD, TX_PAUSE_IGNORE, 28, 1) +FIELD(GENET_UMAC_CMD, TX_RX_EN, 29, 1) +FIELD(GENET_UMAC_CMD, RUNT_FILTER_DIS, 30, 1) +FIELD(GENET_UMAC_CMD, RSVD_31, 31, 1) + +REG32(GENET_UMAC_MAC_0, 0) +FIELD(GENET_UMAC_MAC_0, ADDR_3, 0, 8) +FIELD(GENET_UMAC_MAC_0, ADDR_2, 8, 8) +FIELD(GENET_UMAC_MAC_0, ADDR_1, 16, 8) +FIELD(GENET_UMAC_MAC_0, ADDR_0, 24, 8) + +REG32(GENET_UMAC_MAC_1, 0) +FIELD(GENET_UMAC_MAC_1, ADDR_5, 0, 8) +FIELD(GENET_UMAC_MAC_1, ADDR_4, 8, 8) +FIELD(GENET_UMAC_MAC_1, RSVD_16_31, 16, 8) + +REG32(GENET_UMAC_MDIO_CMD, 0) +FIELD(GENET_UMAC_MDIO_CMD, REG_DATA, 0, 16) +FIELD(GENET_UMAC_MDIO_CMD, REG_ID, 16, 5) +FIELD(GENET_UMAC_MDIO_CMD, PHY_ID, 21, 5) +FIELD(GENET_UMAC_MDIO_CMD, WR, 26, 1) +FIELD(GENET_UMAC_MDIO_CMD, RD, 27, 1) +FIELD(GENET_UMAC_MDIO_CMD, RD_FAIL, 28, 1) +FIELD(GENET_UMAC_MDIO_CMD, START_BUSY, 29, 1) +FIELD(GENET_UMAC_MDIO_CMD, RSVD_30_31, 30, 2) + +REG32(GENET_DMA_RING_CFG, 0) +FIELD(GENET_DMA_RING_CFG, EN, 0, 17) +FIELD(GENET_DMA_RING_CFG, RSVD_17_31, 17, 14) + +REG32(GENET_DMA_CTRL, 0) +FIELD(GENET_DMA_CTRL, EN, 0, 1) +FIELD(GENET_DMA_CTRL, RING_BUF_EN, 1, 17) +FIELD(GENET_DMA_CTRL, RSVD_18_19, 18, 2) +FIELD(GENET_DMA_CTRL, TSB_SWAP_EN, 20, 1) +FIELD(GENET_DMA_CTRL, RSVD_21_31, 21, 11) + +REG32(GENET_DMA_PROD_INDEX, 0) +FIELD(GENET_DMA_PROD_INDEX, INDEX, 0, 16) +FIELD(GENET_DMA_PROD_INDEX, DISCARD_CNT, 16, 16) + +REG32(GENET_DMA_CONS_INDEX, 0) +FIELD(GENET_DMA_CONS_INDEX, INDEX, 0, 16) +FIELD(GENET_DMA_CONS_INDEX, RSVD_16_31, 16, 16) + +REG32(GENET_DMA_STATUS, 0) +FIELD(GENET_DMA_STATUS, DISABLED, 0, 1) +FIELD(GENET_DMA_STATUS, DESC_RAM_INIT_BUSY, 1, 1) +FIELD(GENET_DMA_STATUS, RSVD_2_31, 2, 30) + +#define GENET_DMA_ENABLE_MASK ((1U << 18) - 1) + +REG32(GENET_RDMA_LENGTH_STATUS, 0) +FIELD(GENET_RDMA_LENGTH_STATUS, OVERRUN, 0, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, CRC_ERROR, 1, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, RXERR, 2, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, NO, 3, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, LG, 4, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, MULTICAST, 5, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, BROADCAST, 6, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, RSVD_7_11, 7, 5) +FIELD(GENET_RDMA_LENGTH_STATUS, WRAP, 12, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, SOP, 13, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, EOP, 14, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, OWN, 15, 1) +FIELD(GENET_RDMA_LENGTH_STATUS, BUFLENGTH, 16, 12) +FIELD(GENET_RDMA_LENGTH_STATUS, RSVD_28_31, 29, 4) =20 static uint64_t bcm2838_genet_read(void *opaque, hwaddr offset, unsigned s= ize) { diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index af5e8abd2e..b3893c2dad 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -18,6 +18,10 @@ OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_GE= NET) #define BCM2838_GENET_REV_MAJOR 6 #define BCM2838_GENET_REV_MINOR 0 =20 +#define BCM2838_GENET_DMA_DESC_CNT 256 +#define BCM2838_GENET_DMA_RING_CNT 17 +#define BCM2838_GENET_DMA_RING_DEFAULT (BCM2838_GENET_DMA_RING_CNT - 1) + typedef struct { uint32_t rev_ctrl; uint32_t port_ctrl; @@ -83,6 +87,88 @@ typedef struct { uint32_t reserved_0x18[58]; } BCM2838GenetRegsTbuf; =20 +typedef struct { + uint32_t reserved_0x0; + uint32_t hd_bkp_ctrl; + uint32_t cmd; + uint32_t mac0; + uint32_t mac1; + uint32_t max_frame_len; + uint32_t pause_quanta; + uint32_t reserved_0x1C[10]; + uint32_t mode; + uint32_t frm_tag0; + uint32_t frm_tag1; + uint32_t reserved_0x50[3]; + uint32_t tx_ipg_len; + uint32_t reserved_0x60; + uint32_t eee_ctrl; + uint32_t eee_lpi_timer; + uint32_t eee_wake_timer; + uint32_t eee_ref_count; + uint32_t reserved_0x74; + uint32_t rx_ipg_inv; + uint32_t reserved_0x7C[165]; + uint32_t macsec_prog_tx_crc; + uint32_t macsec_ctrl; + uint32_t reserved_0x318[6]; + uint32_t pause_ctrl; + uint32_t tx_flush; + uint32_t rx_fifo_status; + uint32_t tx_fifo_status; + uint32_t reserved_0x340[48]; + uint32_t mib[96]; + uint32_t mib_ctrl; + uint32_t reserved_0x584[36]; + uint32_t mdio_cmd; + uint32_t reserved_0x618[2]; + uint32_t mpd_ctrl; + uint32_t mpd_pw_ms; + uint32_t mpd_pw_ls; + uint32_t reserved_0x62C[3]; + uint32_t mdf_err_cnt; + uint32_t reserved_0x63C[5]; + uint32_t mdf_ctrl; + uint32_t mdf_addr; + uint32_t reserved_0x658[106]; +} BCM2838GenetRegsUmac; + +typedef struct { + uint32_t length_status; + uint32_t address_lo; + uint32_t address_hi; +} BCM2838GenetRdmaDesc; + +typedef struct { + uint32_t write_ptr; + uint32_t write_ptr_hi; + uint32_t prod_index; + uint32_t cons_index; + uint32_t ring_buf_size; + uint32_t start_addr; + uint32_t start_addr_hi; + uint32_t end_addr; + uint32_t end_addr_hi; + uint32_t mbuf_done_tresh; + uint32_t xon_xoff_tresh; + uint32_t read_ptr; + uint32_t read_ptr_hi; + uint32_t reserved_0x34[3]; +} BCM2838GenetRdmaRing; + +typedef struct { + BCM2838GenetRdmaDesc descs[BCM2838_GENET_DMA_DESC_CNT]; + BCM2838GenetRdmaRing rings[BCM2838_GENET_DMA_RING_CNT]; + uint32_t ring_cfg; + uint32_t ctrl; + uint32_t status; + uint32_t scb_burst_size; + uint32_t reserved_0x1050[7]; + uint32_t ring_timeout[17]; + uint32_t index2ring[8]; + uint32_t reserved_0x10D0[972]; +} BCM2838GenetRegsRdma; + typedef struct { BCM2838GenetRegsSys sys; BCM2838GenetRegsGrBridge gr_bridge; @@ -95,6 +181,9 @@ typedef struct { uint32_t reserved_0x400[128]; BCM2838GenetRegsTbuf tbuf; uint32_t reserved_0x700[64]; + BCM2838GenetRegsUmac umac; + uint32_t reserved_0x1000[1024]; + BCM2838GenetRegsRdma rdma; } BCM2838GenetRegs; =20 struct BCM2838GenetState { --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459081; cv=none; d=zohomail.com; s=zohoarc; b=Qn1w4AqNK9wD12k7xYXIzknEAeE+9kJwUG5u/GStwHzD9DsjI5LmtnpCgmr7DPwdL/xEqbCxajNCHu0ceuXXPbzANAD+z8ykGT/VuSFvGRWiU7xiXywFspkfEODB5115htGQlhWWEk2CsCzQq0Bx4tGOq+92N7mwbT+ZqQjx5q0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459081; 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=JG8gY9PAlCKIyKYWhNRc1z3JB5KU3lo2c3dTtOk5u3A=; b=kwE1Xxb46Zf82r1atufQLRemDlEObNSNWYkVLYr56BzOkdVnMbqkuL6Baghg8+FBsMRrR2ZV/ojKk2cS1X4DpTw+k4UarBMs5cqlIzifn2PJIZY0jQ0mEl/T7zux1y+3avOFc4e+ylDXmbZCr8O+qBCI1DdoAqXg2N7NxZ7LQ68= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459081186518.1279067161821; Tue, 11 Aug 2026 07:38:01 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnan-0000im-2b; Tue, 11 Aug 2026 10:36:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaM-0000Ir-Lz for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:13 -0400 Received: from mail-qv1-xf2c.google.com ([2607:f8b0:4864:20::f2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaJ-0001so-Ih for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:09 -0400 Received: by mail-qv1-xf2c.google.com with SMTP id 6a1803df08f44-8f29ec73064so17587086d6.1 for ; Tue, 11 Aug 2026 07:36:07 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.05 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458966; x=1787063766; 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:content-type; bh=JG8gY9PAlCKIyKYWhNRc1z3JB5KU3lo2c3dTtOk5u3A=; b=qUR39rpsHmPJVhg0hcUw6CFqXWKzNoPbSGLBM/fdko6lzjJmDctlbUqTuuhaEux94n 9oEDpDdDa6DYMGm+L1cg39mFEGi9kpv4pM/SmCUZ4MOBG0rXc72HqlqF3phg/+u7H7PM iR5+CS83KWsopIxSrdodM3ca1RbPrwF2eE7K48GHsgW55RSjxGFxNQJd0y6ciVS2QFZf BxOjh3bZcSdvCoRzqYwyZBSg2ipacE+bQslhYU/d79lKt68u1ZG/Yi0ytQwZaVWWbrnY Wk/d/q5wU1fQ+NhQYo0beB0K4rbxnvwc6nRy+LY+iW3FADJPa0VjTj3KXH8ILHjnXOab qGEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458967; x=1787063767; 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:content-type; bh=JG8gY9PAlCKIyKYWhNRc1z3JB5KU3lo2c3dTtOk5u3A=; b=W6HyMVmuVmaSo4gbI1i5Ci6DzD7DWP9Ut0C+dJQIUOb9XWvL8rdrioH0vUS82Fse+L rYhuLK8lg00RwZ9yNUllqiDEUGqdw12/jCz+MLGIrcZ4Auvj00MumB6bHIXmNwvztY+u CvPdNGMLe1V8FPgWSYbQ9cR8jfAkdUM2lQpRopSM+M/a/Pevfg+PHVuuiijICaqT+t3v z1bXMz5SqAzrd6HcW38YKwniIeFvxrye3olbV5D0L6wyLpXuCkT9Foohz/DbQgnEWJIP +DEa4mfiHDv9u/mEnfo48pMOOZs0Q3j1++ACgDIkVG3SeZszK/NJDkW3U9K2zLUD6AmN VkyA== X-Gm-Message-State: AOJu0YzSdE1SFkHGbZ8/HFMr2dyTJCSiQQO6cB/a3Yo8gmbC+RFbY19f QtWD+ZoETxTiY4MKAtEJrul9C3XTV/VVsh2ihSNybKfFEsM+zZVF3fAZwjpKyg== X-Gm-Gg: AR+sD12Azhnlg3LWJZ0Lptgt8bwfmv6k0RcWjv0NzRDnyZny6OV43YFguDzYoGII8UJ enqlc+FiS24WLqTBW5m4mwi6Azegsz3IEkssFFxcUSzVj1VcrCYrYLGuqa/AfkSrjyyqBHuX54U YwT0ltM+a4PulzCBZRzdvyNx1v5cXVr1s8/sV94IC3I1pxzULOfMio9XraQWhhEn2y0mBhOJ/8z 1JalPLhpGCmJhtnQpGZYtjTtu6dEWoqENsZAL/Na6wxzLew5+G/rw0zuEAbsFxM+DTyJUZgmQPM /2NLQWzGxoJa/pFosdHQieyA3bp4WUyCRJSZosQu5btZqWytxzdfOWTUvkQshP2bvjfoKI0O5Bv j/q4368k6tydB3eo8NQTKvp2/WgZ10zqenF323HHGNiI0oAUiVBlxB9StQgfWGT+YRWjHrMehve Ty6Ce/Z6nByjXzXLOQXzx6sEcUhsCybynK57C9ucisWtalaxM5aasEGIWLTp1mgHXsg5P2EAcIp poT2xddUvsiHUXh43I= X-Received: by 2002:a05:6214:f26:b0:8ea:fb8c:2e0a with SMTP id 6a1803df08f44-90a66954d59mr31445816d6.28.1786458966651; Tue, 11 Aug 2026 07:36:06 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 07/19] hw/net/bcm2838_genet: add GENET register structs, part 3/4 Date: Tue, 11 Aug 2026 10:35:44 -0400 Message-ID: <20260811143557.7862-8-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f2c; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf2c.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=ham 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: 1786459084552158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Add the TDMA (transmit DMA ring/length-status) register layout and field accessors, and the PHY BMCR/BMSR MII register field definitions. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 88 ++++++++++++++++++++++++++++++++++ include/hw/net/bcm2838_genet.h | 88 ++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 12a80534fb..2bc2a770b1 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -148,6 +148,94 @@ FIELD(GENET_RDMA_LENGTH_STATUS, OWN, 15, 1) FIELD(GENET_RDMA_LENGTH_STATUS, BUFLENGTH, 16, 12) FIELD(GENET_RDMA_LENGTH_STATUS, RSVD_28_31, 29, 4) =20 +REG32(GENET_TDMA_LENGTH_STATUS, 0) +FIELD(GENET_TDMA_LENGTH_STATUS, RSVD_0_3, 0, 4) +FIELD(GENET_TDMA_LENGTH_STATUS, DO_CSUM, 4, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, OW_CRC, 5, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, APPEND_CRC, 6, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, RSVD_7_8, 7, 2) +FIELD(GENET_TDMA_LENGTH_STATUS, UNDERRUN, 9, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, RSVD_10_11, 10, 2) +FIELD(GENET_TDMA_LENGTH_STATUS, WRAP, 12, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, SOP, 13, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, EOP, 14, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, OWN, 15, 1) +FIELD(GENET_TDMA_LENGTH_STATUS, BUFLENGTH, 16, 12) +FIELD(GENET_TDMA_LENGTH_STATUS, RSVD_28_31, 29, 4) + +REG16(GENET_PHY_BMCR, 0) +FIELD(GENET_PHY_BMCR, RSVD_0_5, 0, 6) +FIELD(GENET_PHY_BMCR, SPEED1000, 6, 1) +FIELD(GENET_PHY_BMCR, CTST, 7, 1) +FIELD(GENET_PHY_BMCR, FULLDPLX, 8, 1) +FIELD(GENET_PHY_BMCR, ANRESTART, 9, 1) +FIELD(GENET_PHY_BMCR, ISOLATE, 10, 1) +FIELD(GENET_PHY_BMCR, PDOWN, 11, 1) +FIELD(GENET_PHY_BMCR, AENABLE, 12, 1) +FIELD(GENET_PHY_BMCR, SPEED100, 13, 1) +FIELD(GENET_PHY_BMCR, LOOPBACK, 14, 1) +FIELD(GENET_PHY_BMCR, RESET, 15, 1) + +REG16(GENET_PHY_BMSR, 0) +FIELD(GENET_PHY_BMSR, ERCAP, 0, 1) +FIELD(GENET_PHY_BMSR, JCD, 1, 1) +FIELD(GENET_PHY_BMSR, LSTATUS, 2, 1) +FIELD(GENET_PHY_BMSR, ANEGCAPABLE, 3, 1) +FIELD(GENET_PHY_BMSR, RFAULT, 4, 1) +FIELD(GENET_PHY_BMSR, ANEGCOMPLETE, 5, 1) +FIELD(GENET_PHY_BMSR, RSVD_6_7, 6, 2) +FIELD(GENET_PHY_BMSR, ESTATEN, 8, 1) +FIELD(GENET_PHY_BMSR, _100HALF2, 9, 1) +FIELD(GENET_PHY_BMSR, _100FULL2, 10, 1) +FIELD(GENET_PHY_BMSR, _10HALF, 11, 1) +FIELD(GENET_PHY_BMSR, _10FULL, 12, 1) +FIELD(GENET_PHY_BMSR, _100HALF, 13, 1) +FIELD(GENET_PHY_BMSR, _100FULL, 14, 1) +FIELD(GENET_PHY_BMSR, _10BASE4, 15, 1) + +REG16(GENET_PHY_LPA, 0) +FIELD(GENET_PHY_LPA, SLCT, 0, 5) +FIELD(GENET_PHY_LPA, _10HALF_1000XFULL, 5, 1) +FIELD(GENET_PHY_LPA, _10FULL_1000XHALF, 6, 1) +FIELD(GENET_PHY_LPA, _100HALF_1000XPAUSE, 7, 1) +FIELD(GENET_PHY_LPA, _100FULL_1000XPAUSE_ASYM, 8, 1) +FIELD(GENET_PHY_LPA, _100BASE4, 9, 1) +FIELD(GENET_PHY_LPA, PAUSE_CAP, 10, 1) +FIELD(GENET_PHY_LPA, PAUSE_ASYM, 11, 1) +FIELD(GENET_PHY_LPA, RSVD_12, 12, 1) +FIELD(GENET_PHY_LPA, RFAULT, 13, 1) +FIELD(GENET_PHY_LPA, LPACK, 14, 1) +FIELD(GENET_PHY_LPA, NPAGE, 15, 1) + +REG16(GENET_PHY_STAT_1000, 0) +FIELD(GENET_PHY_STAT_1000, RSVD_0_9, 0, 10) +FIELD(GENET_PHY_STAT_1000, HALF, 10, 1) +FIELD(GENET_PHY_STAT_1000, FULL, 11, 1) +FIELD(GENET_PHY_STAT_1000, REMRXOK, 12, 1) +FIELD(GENET_PHY_STAT_1000, LOCALRXOK, 13, 1) +FIELD(GENET_PHY_STAT_1000, MSRES, 14, 1) +FIELD(GENET_PHY_STAT_1000, MSFAIL, 15, 1) + +REG16(GENET_PHY_AUX_CTRL_0, 0) +FIELD(GENET_PHY_AUX_CTRL_0, REG_ID_MASK, 0, 3) +FIELD(GENET_PHY_AUX_CTRL_0, RSVD_3, 3, 1) +FIELD(GENET_PHY_AUX_CTRL_0, REG_DATA, 4, 8) +FIELD(GENET_PHY_AUX_CTRL_0, REG_ID, 12, 3) +FIELD(GENET_PHY_AUX_CTRL_0, MISC_WREN, 15, 1) + +REG16(GENET_PHY_AUX_CTRL_1, 0) +FIELD(GENET_PHY_AUX_CTRL_1, RSVD_0_3, 0, 4) +FIELD(GENET_PHY_AUX_CTRL_1, REG_DATA, 4, 12) + +REG16(GENET_PHY_SHADOW, 0) +FIELD(GENET_PHY_SHADOW, REG_DATA, 0, 10) +FIELD(GENET_PHY_SHADOW, REG_ID, 10, 5) +FIELD(GENET_PHY_SHADOW, WR, 15, 1) + +REG16(GENET_PHY_EXP_SEL, 0) +FIELD(GENET_PHY_EXP_SEL, REG_ID, 0, 8) +FIELD(GENET_PHY_EXP_SEL, BLOCK_ID, 8, 8) + static uint64_t bcm2838_genet_read(void *opaque, hwaddr offset, unsigned s= ize) { uint64_t value =3D ~0; diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index b3893c2dad..fedfbde066 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -22,6 +22,9 @@ OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_GEN= ET) #define BCM2838_GENET_DMA_RING_CNT 17 #define BCM2838_GENET_DMA_RING_DEFAULT (BCM2838_GENET_DMA_RING_CNT - 1) =20 +#define BCM2838_GENET_HFB_FILTER_CNT 48 +#define BCM2838_GENET_HFB_FILTER_SIZE 128 + typedef struct { uint32_t rev_ctrl; uint32_t port_ctrl; @@ -169,6 +172,53 @@ typedef struct { uint32_t reserved_0x10D0[972]; } BCM2838GenetRegsRdma; =20 +typedef struct { + uint32_t length_status; + uint32_t address_lo; + uint32_t address_hi; +} BCM2838GenetTdmaDesc; + +typedef struct { + uint32_t read_ptr; + uint32_t read_ptr_hi; + uint32_t cons_index; + uint32_t prod_index; + uint32_t ring_buf_size; + uint32_t start_addr; + uint32_t start_addr_hi; + uint32_t end_addr; + uint32_t end_addr_hi; + uint32_t mbuf_done_tresh; + uint32_t flow_period; + uint32_t write_ptr; + uint32_t write_ptr_hi; + uint32_t reserved_0x34[3]; +} BCM2838GenetTdmaRing; + +typedef struct { + BCM2838GenetTdmaDesc descs[BCM2838_GENET_DMA_DESC_CNT]; + BCM2838GenetTdmaRing rings[BCM2838_GENET_DMA_RING_CNT]; + uint32_t ring_cfg; + uint32_t ctrl; + uint32_t status; + uint32_t scb_burst_size; + uint32_t reserved_0x1050[7]; + uint32_t arb_ctrl; + uint32_t priority[3]; + uint32_t reserved_0x10D0[993]; +} BCM2838GenetRegsTdma; + +typedef struct { + uint8_t flt[BCM2838_GENET_HFB_FILTER_CNT * BCM2838_GENET_HFB_FILTER_SI= ZE + * sizeof(uint32_t)]; + uint32_t reserved_0x6000[1792]; + uint32_t ctrl; + uint32_t flt_enable[2]; + uint32_t reserved_0x7C0C[4]; + uint32_t flt_len[BCM2838_GENET_HFB_FILTER_CNT / sizeof(uint32_t)]; + uint32_t reserved_0x7C4C[237]; +} BCM2838GenetRegsHfb; + typedef struct { BCM2838GenetRegsSys sys; BCM2838GenetRegsGrBridge gr_bridge; @@ -184,8 +234,45 @@ typedef struct { BCM2838GenetRegsUmac umac; uint32_t reserved_0x1000[1024]; BCM2838GenetRegsRdma rdma; + BCM2838GenetRegsTdma tdma; + uint32_t reserved_0x6000[2048]; + BCM2838GenetRegsHfb hfb; } BCM2838GenetRegs; =20 +typedef struct { + uint16_t bmcr; + uint16_t bmsr; + uint16_t sid1; + uint16_t sid2; + uint16_t advertise; + uint16_t lpa; + uint16_t expansion; + uint16_t next_page; + uint16_t lpa_next_page; + uint16_t ctrl1000; + uint16_t stat1000; + uint16_t reserved_11_12[2]; + uint16_t mmd_ctrl; + uint16_t mmd_data; + uint16_t estatus; + uint16_t ecr; + uint16_t esr; + uint16_t dcounter; + uint16_t fcscounter; + uint16_t nwaytest; + uint16_t exp_data; + uint16_t srevision; + uint16_t exp_ctrl; + uint16_t aux_ctl; + uint16_t phyaddr; + uint16_t isr; + uint16_t imr; + uint16_t shd; + uint16_t reserved_29; + uint16_t rdb_addr; + uint16_t rdb_data; +} BCM2838GenetPhyRegs; + struct BCM2838GenetState { /*< private >*/ SysBusDevice parent_obj; @@ -196,6 +283,7 @@ struct BCM2838GenetState { AddressSpace dma_as; =20 BCM2838GenetRegs regs; + BCM2838GenetPhyRegs phy_regs; =20 qemu_irq irq_default; qemu_irq irq_prio; --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459032; cv=none; d=zohomail.com; s=zohoarc; b=BOcE1dUqvwgWeEZ/rKgFc2zKkXA9h6ph8nZ19HGwTs9TNLsXksdB+U/2mrTcSGxvGtEv9zlcDReHy8/fGQw8JrjsK+gewxqS2QJ5Al6TgI1NF7QM+qZqnfnn4JrnNQrixLKQyzh4ACrX9d/PTO/MEvo7c3vAHbTJF6Jd/B3aFVA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459032; 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=xsYLjlscox7P7BfombKX5T/LNj0yU2z7O4B/638wR0E=; b=iyfAM5Z1lWFo8LDTMI9D3mkq3SbNQz+K1Mzgi7adtHYwlFu7ixkkYlVMr3tBJrWzW8L5F8N9Cf5wU8eYasOsPmJOY3K40Ci07ZxLh5mOeITYxby7a6dIV41zFwe1YednFjk0Q8jjNCVrHslzwMsWOIuqdJpuQQofVglrehlVaSU= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459032695163.94197365530772; Tue, 11 Aug 2026 07:37:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnak-0000ae-Nf; Tue, 11 Aug 2026 10:36:36 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaM-0000Iu-Nt for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:13 -0400 Received: from mail-qt1-x832.google.com ([2607:f8b0:4864:20::832]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaK-0001tE-Mm for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:09 -0400 Received: by mail-qt1-x832.google.com with SMTP id d75a77b69052e-52b6543169fso19601091cf.2 for ; Tue, 11 Aug 2026 07:36:08 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.06 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458968; x=1787063768; 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:content-type; bh=xsYLjlscox7P7BfombKX5T/LNj0yU2z7O4B/638wR0E=; b=H1BCb0lO4QPG6IO63OAZn8t9Ma6EzPHzp0PAIQ0O0wZK3TY4jX/XrNBs8HipKc9SJ0 nT9SmN1fl8IviYmUWn2NluG5U2x66T5cYyB4/9IlmarSUn90FlZX1Z1Y+CyJ0lKVYbLx fTH6+W5k7ywsSgU1YxURbVEKBF4HeUfGuGrImrUUrJGD4qhiw7scQjGIIeARi0qypb3C SdsH8rKMV5rmeJ12TpzSPE/egA0v1Hcf7iZFvR7NiuV43tpsB8RDn3t4Wh/dHuXgcsf1 rA/1XsmGmZoSPfg6/RYnwj8hafU+SNgQXi0CuhkI4/57IEp+GiTBb9IIYhuIEKeaiybr YW3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458968; x=1787063768; 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:content-type; bh=xsYLjlscox7P7BfombKX5T/LNj0yU2z7O4B/638wR0E=; b=cxq6jBbehZReDjGfMyDGIJk27C8IJfFOXc0w16NU3crUuqRZ9If6hZuv0UkToYNYCt YfnRcGkKIPf5TvkqeLytLdjpZMXowrGi4046KqqCjveUWIDCXmI5pn/zFEsQwW2MTJZU C8gRfR4MW71wRu0a3LeSCGOPqOWR72aEmkoXJCwDnJLmCqTrZGTTG5uOnl5/BCpMLhW0 Lqs5xNlp7GKVT8Tz6SFhUsbCthUQMkoippzqyqeMeYII0t0OKCQPeUj2Xr/kSjZVdca3 dYXxGs6MK6qgqFH29anq3AlCeR2mLx9yQ4KYeu4rUCJHXpf8vyQgPynJt9idDGPPwTmh v2Lg== X-Gm-Message-State: AOJu0YyWdisI6lRlksPlMRfMe9hL4s5FyMzvQT1SQG0KLIsDNq33mTjs 7sEiu/h5h50aMvZu0KN1fB+xOGNLsxY6kcxvChkxZiMVzS4GpGREYhIyWGnKUg== X-Gm-Gg: AR+sD11EGXA1SLTHQYJoPV045jltBcsKlQRXXZ938FFIGrk5IAWgVsSCDOJRl0WaHZz DFpmD3EiIljShy+Y4H2o3JKfN8cS45vyWilsWSu6wb0OfzcjWxgDrEkLOlfJCoUsLaizY1XxcvQ KcnK1pGcg2eJMB1hM24VJAA4Wr4wfm1mQZzGh0ySaTfl+LRelGT/TmP09BUpYqHS8szD0SjX+rG ykY5QTmPjmyyRF2EmbbVkZ/Zg2pKBwtdBzgY0Ya90DiCUwNudrTKmcvljUrdBS2AL8OSC+vGHaX VfSSay6hyEvPbK5FCaLSY0LL0IfpmzmqkvNK5Z9Qw4TlGHPuYkafIoxMZV9V3Ix5vEn/4hWco8q PxG9Z3ogp6EEPHylKgB3XdRsWVG2xt4US1Ek5dwa3UelQAKFUNCN0795LftkQrk4rCcrE8lnidH foPD16zSYZutI5RmGmCL/Esi/Rdl8GVuhSPUSOf7LFhae2s085x2kY/3Wot37hHT/8idDdXsvTV uvaUQrBEOr73ux0M4E= X-Received: by 2002:a05:622a:15c3:b0:528:3216:b802 with SMTP id d75a77b69052e-52d58544b0emr33334841cf.15.1786458967672; Tue, 11 Aug 2026 07:36:07 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 08/19] hw/net/bcm2838_genet: add GENET register structs, part 4/4 Date: Tue, 11 Aug 2026 10:35:45 -0400 Message-ID: <20260811143557.7862-9-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::832; envelope-from=marcelomanzo@gmail.com; helo=mail-qt1-x832.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=ham 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: 1786459034448158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Add the PHY "shadow" register structs (BCM54213PE PHY-specific clock control, RGMII mode, LED, and expansion-block registers accessed via the AUX_CTL/EXP_SHD indirection scheme) used by the MDIO emulation added in a later patch. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- include/hw/net/bcm2838_genet.h | 37 ++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index fedfbde066..12439b580d 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -25,6 +25,12 @@ OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_GE= NET) #define BCM2838_GENET_HFB_FILTER_CNT 48 #define BCM2838_GENET_HFB_FILTER_SIZE 128 =20 +#define BCM2838_GENET_PHY_AUX_CTL_MISC 0x7 +#define BCM2838_GENET_PHY_AUX_CTL_REGS_SIZE 8 + +#define BCM2838_GENET_PHY_EXP_SHD_BLOCKS_CNT 256 +#define BCM2838_GENET_PHY_EXP_SHD_REGS_CNT 256 + typedef struct { uint32_t rev_ctrl; uint32_t port_ctrl; @@ -273,6 +279,34 @@ typedef struct { uint16_t rdb_data; } BCM2838GenetPhyRegs; =20 +typedef struct { + uint16_t reserved_0_2[3]; + uint16_t clk_ctl; + uint16_t scr2; + uint16_t scr3; + uint16_t reserved_6_9[4]; + uint16_t apd; + uint16_t rgmii_mode; + uint16_t reserved_12; + uint16_t leds1; + uint16_t reserved_14_18[5]; + uint16_t _100fx_ctrl; + uint16_t ssd; + uint16_t reserved_21_30[10]; + uint16_t mode; +} BCM2838GenetPhyShdRegs; + +typedef struct { + uint16_t auxctl; + uint16_t reserved_1_6[BCM2838_GENET_PHY_AUX_CTL_REGS_SIZE - 2]; + uint16_t misc; +} BCM2838GenetPhyAuxShdRegs; + +typedef struct { + uint16_t regs[BCM2838_GENET_PHY_EXP_SHD_BLOCKS_CNT] + [BCM2838_GENET_PHY_EXP_SHD_REGS_CNT]; +} BCM2838GenetPhyExpShdRegs; + struct BCM2838GenetState { /*< private >*/ SysBusDevice parent_obj; @@ -284,6 +318,9 @@ struct BCM2838GenetState { =20 BCM2838GenetRegs regs; BCM2838GenetPhyRegs phy_regs; + BCM2838GenetPhyShdRegs phy_shd_regs; + BCM2838GenetPhyAuxShdRegs phy_aux_ctl_shd_regs; + BCM2838GenetPhyExpShdRegs phy_exp_shd_regs; =20 qemu_irq irq_default; qemu_irq irq_prio; --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459037; cv=none; d=zohomail.com; s=zohoarc; b=Bs/yHaPHpYIVgVvhaZ4E3c7DWWGUTPfGpU2x4i18NXbMMio9o1IGQDkltUVpCsK6tWxZ4K5VUnC1ylxKml1ndPju7DjTQnzxcKHyX/fOfnCuecIXS6Yoe50+F5sS5/o8Uiew8WmtxKDN5hrP707YpFW65k+4XY+4NrL+eciWtz0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459037; 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=5DF/roODHfFHQQFRWJENRPG9PsVBeH7GEX5xxemSqm4=; b=h9CMLUOe8dCxSY1okH+Ap4AJmLqnYgfhd2w05JtH16bzJ8ZaZrDrcXENR15om9j+ggnPCSLHTWBTyW7tc2LRa9KZj1NFqE28qyp6JMJ+lfkdaLRl9d2sfLm4+xe5rC+LISrWD3OAy1D/MTvctmIV2KVJ+1ojbk/Zs3Og4pNSXPA= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459037579955.586342241303; Tue, 11 Aug 2026 07:37:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnap-0000t4-6K; Tue, 11 Aug 2026 10:36:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaO-0000J3-5Y for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:17 -0400 Received: from mail-qt1-x834.google.com ([2607:f8b0:4864:20::834]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaM-0001tb-Dn for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:11 -0400 Received: by mail-qt1-x834.google.com with SMTP id d75a77b69052e-51c15bf5000so14751991cf.3 for ; Tue, 11 Aug 2026 07:36:09 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.07 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458969; x=1787063769; 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:content-type; bh=5DF/roODHfFHQQFRWJENRPG9PsVBeH7GEX5xxemSqm4=; b=AOLbObMnuI24NbZvm+JGv2aYskYJfkizg8Mdo2bu32U6yKO5aYlCEw+BqffxQsHjD/ VKnRUwFHpBIOHkPD2jHh90Rn/nIYLFmGm7AGbhnRBqF0EXVNFuz0vUU/uPJYLWF060X4 nr/J7Nz1+4rntSCYamSGdzho92dQsyzBKMJu76ITmROk5AEEmRlq96BKd7pQ7tJYoofG lD+il589f87otU1cehJcQuLM31ug+i0Fr8rXkINzke+hDEVJTAfIauJqUPHIcHq9f1wQ icdGgy57yNDk8Q19uFgz5q4+l/bexh3+pr4bfGX1giQpBj+0wLnDVVI5g7rZSrlV3S42 FROw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458969; x=1787063769; 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:content-type; bh=5DF/roODHfFHQQFRWJENRPG9PsVBeH7GEX5xxemSqm4=; b=C2IN+UeQgc2FoX5uBQIEMaIV2xSwhrTpEEuDHHP/KZNJD1oaiTO1Gg3mcj+A1w2/3N 5dK4mv022YWIly/bpjB8YLt6VBHo3Ly7T8NKc2byKY01kcrAjfnNbYY6r6H+I2qO3nSB Z3L6kJ7YkOjdZSqF16StXywvLF3V+ForhCTUJabBvA038CusUrtvpgT/yXISzZbIGSbA 8yirSESGEY3cWzY4/pRH49I1FxccCkIOxLU8bQxIRaEIht7r8CqMDatG0eWBPqitXZzY xVbVoV+RYPfTPZ6gVhwZoc5Md6FL7RPgY78kv5BoEbJrENR+QILEcHvFQqXtLP/2fJ89 pRiQ== X-Gm-Message-State: AOJu0Yze/272OoOMWx3gTjzcbOoreShT0MMRKxBR3fYM4DwY/ELrAfBQ g7JnNp6Am5zSwQWsX1NjH44XJhDBwAnqKYWlXNKPEbWvsyEn3aqcJOzTbLpenQ== X-Gm-Gg: AR+sD108c3gwGf5tn0Jpxth1oEAO5qCzwUbsXhCFU3JQQUoGteZoV89YHfHvb/vl+U0 8SQxFkmE2cfxLxfgKRNfHWgrPZkdjQRdCdTRy2fLLOPXR4heznRGvBLq0bGwbIkO5S+45BpupTj ZdMz639QXgGVWwtNcxp8p22VQJocctbyFamiaIVnM0Tf33i1BEW+OEsVi0J4UpHOZHOtoFxNBBk DbVCg1r43er5xEq+I67TNfxrz3gj0ycOycGoaEy9KJ1yWVdQ6lEcylknEBpqskTCTdIgI54sTM/ dFtZWYX9TOSwqW2cCjQTXs83QtFQVo3vc+M80jVBq0kuQXPtzVvk40AVVTf93va2Yo5CbSTW/RF zgXcixMCnXstKEU/za8fcjGQL3NKXnyU7qVBRMGAFMPFcSZhmDUChMDfo9/mb0J95fS5UQNnxtS BGVQcK74SGJEgtwKO3PmO3mHXr6dQhUJIHi5YD4ZlBHmjbSp0GYLe0caMsNIPYEOmE+Pjm7ms52 d5MSvyerFSiIdWgFvg= X-Received: by 2002:a05:622a:a18:b0:519:efea:cf41 with SMTP id d75a77b69052e-52d585dea65mr34155651cf.28.1786458968837; Tue, 11 Aug 2026 07:36:08 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 09/19] hw/net/bcm2838_genet: add GENET register access macros Date: Tue, 11 Aug 2026 10:35:46 -0400 Message-ID: <20260811143557.7862-10-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::834; envelope-from=marcelomanzo@gmail.com; helo=mail-qt1-x834.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, UPPERCASE_50_75=0.008 autolearn=no 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: 1786459039543158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Add offsetof()-based byte-offset macros for the register block layouts added in the previous patches (INTRL0/1, UMAC, TDMA/RDMA and their per-ring registers, HFB filters), used by the MMIO read/write dispatch implemented in the following patches. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- include/hw/net/bcm2838_genet.h | 78 ++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index 12439b580d..b9895933b6 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -22,9 +22,87 @@ OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_GE= NET) #define BCM2838_GENET_DMA_RING_CNT 17 #define BCM2838_GENET_DMA_RING_DEFAULT (BCM2838_GENET_DMA_RING_CNT - 1) =20 +#define BCM2838_GENET_HFB_FILTER_REGS offsetof(BCM2838GenetRegs, hfb) +#define BCM2838_GENET_HFB_FILTER_REG(reg) (BCM2838_GENET_HFB_FILTER_REGS \ + + offsetof(BCM2838GenetRegsHfb,= reg)) #define BCM2838_GENET_HFB_FILTER_CNT 48 #define BCM2838_GENET_HFB_FILTER_SIZE 128 =20 +#define BCM2838_GENET_INTRL0_REG(reg) (offsetof(BCM2838GenetRegs, intrl0= ) \ + + offsetof(BCM2838GenetRegsIntrl0,= reg)) +#define BCM2838_GENET_INTRL0_SET BCM2838_GENET_INTRL0_REG(set) +#define BCM2838_GENET_INTRL0_CLEAR BCM2838_GENET_INTRL0_REG(clear) +#define BCM2838_GENET_INTRL0_MASK_SET BCM2838_GENET_INTRL0_REG(mask_set) +#define BCM2838_GENET_INTRL0_MASK_CLEAR BCM2838_GENET_INTRL0_REG(mask_clea= r) + +#define BCM2838_GENET_INTRL1_REG(reg) (offsetof(BCM2838GenetRegs, intrl1= ) \ + + offsetof(BCM2838GenetRegsIntrl1,= reg)) +#define BCM2838_GENET_INTRL1_SET BCM2838_GENET_INTRL1_REG(set) +#define BCM2838_GENET_INTRL1_CLEAR BCM2838_GENET_INTRL1_REG(clear) +#define BCM2838_GENET_INTRL1_MASK_SET BCM2838_GENET_INTRL1_REG(mask_set) +#define BCM2838_GENET_INTRL1_MASK_CLEAR BCM2838_GENET_INTRL1_REG(mask_clea= r) + +#define BCM2838_GENET_UMAC_REG(reg) (offsetof(BCM2838GenetRegs, umac) \ + + offsetof(BCM2838GenetRegsUmac, = reg)) +#define BCM2838_GENET_UMAC_CMD BCM2838_GENET_UMAC_REG(cmd) +#define BCM2838_GENET_UMAC_MAC0 BCM2838_GENET_UMAC_REG(mac0) +#define BCM2838_GENET_UMAC_MAC1 BCM2838_GENET_UMAC_REG(mac1) +#define BCM2838_GENET_UMAC_MDIO_CMD BCM2838_GENET_UMAC_REG(mdio_cmd) + +#define BCM2838_GENET_TDMA_REGS offsetof(BCM2838GenetRegs, tdma) +#define BCM2838_GENET_TDMA_REG(reg) (BCM2838_GENET_TDMA_REGS \ + + offsetof(BCM2838GenetRegsTdma, = reg)) +#define BCM2838_GENET_TDMA_RINGS BCM2838_GENET_TDMA_REG(rings) +#define BCM2838_GENET_TDMA_RING_CFG BCM2838_GENET_TDMA_REG(ring_cfg) +#define BCM2838_GENET_TDMA_CTRL BCM2838_GENET_TDMA_REG(ctrl) +#define BCM2838_GENET_TDMA_STATUS BCM2838_GENET_TDMA_REG(status) + +#define BCM2838_GENET_RDMA_REGS offsetof(BCM2838GenetRegs, rdma) +#define BCM2838_GENET_RDMA_REG(reg) (BCM2838_GENET_RDMA_REGS \ + + offsetof(BCM2838GenetRegsRdma, = reg)) +#define BCM2838_GENET_RDMA_RINGS BCM2838_GENET_RDMA_REG(rings) +#define BCM2838_GENET_RDMA_RING_CFG BCM2838_GENET_RDMA_REG(ring_cfg) +#define BCM2838_GENET_RDMA_CTRL BCM2838_GENET_RDMA_REG(ctrl) +#define BCM2838_GENET_RDMA_STATUS BCM2838_GENET_RDMA_REG(status) + +#define BCM2838_GENET_TRING_REG(reg) offsetof(BCM2838GenetTdmaRing, reg) +#define BCM2838_GENET_TRING_WRITE_PTR BCM2838_GENET_TRING_REG(write_ptr) +#define BCM2838_GENET_TRING_WRITE_PTR_HI BCM2838_GENET_TRING_REG(write_ptr= _hi) +#define BCM2838_GENET_TRING_PROD_INDEX BCM2838_GENET_TRING_REG(prod_index) +#define BCM2838_GENET_TRING_CONS_INDEX BCM2838_GENET_TRING_REG(cons_index) +#define BCM2838_GENET_TRING_RING_BUF_SIZE BCM2838_GENET_TRING_REG(ring_buf= _size) +#define BCM2838_GENET_TRING_RING_START_ADDR BCM2838_GENET_TRING_REG(start_= addr) +#define BCM2838_GENET_TRING_RING_START_ADDR_HI BCM2838_GENET_TRING_REG(sta= rt_addr_hi) +#define BCM2838_GENET_TRING_RING_END_ADDR BCM2838_GENET_TRING_REG(end_addr) +#define BCM2838_GENET_TRING_RING_END_ADDR_HI BCM2838_GENET_TRING_REG(end_a= ddr_hi) +#define BCM2838_GENET_TRING_RING_MBUF_DONE_TRESH BCM2838_GENET_TRING_REG(m= buf_done_tresh) +#define BCM2838_GENET_TRING_RING_FLOW_PERIOD BCM2838_GENET_TRING_REG(flow_= period) +#define BCM2838_GENET_TRING_RING_READ_PTR BCM2838_GENET_TRING_REG(read_ptr) +#define BCM2838_GENET_TRING_RING_READ_PTR_HI BCM2838_GENET_TRING_REG(read_= ptr_hi) + +#define BCM2838_GENET_RRING_REG(reg) offsetof(BCM2838GenetRdmaRing, reg) +#define BCM2838_GENET_RRING_WRITE_PTR BCM2838_GENET_RRING_REG(write_ptr) +#define BCM2838_GENET_RRING_WRITE_PTR_HI BCM2838_GENET_RRING_REG(write_ptr= _hi) +#define BCM2838_GENET_RRING_PROD_INDEX BCM2838_GENET_RRING_REG(prod_index) +#define BCM2838_GENET_RRING_CONS_INDEX BCM2838_GENET_RRING_REG(cons_index) +#define BCM2838_GENET_RRING_RING_BUF_SIZE BCM2838_GENET_RRING_REG(ring_buf= _size) +#define BCM2838_GENET_RRING_RING_START_ADDR BCM2838_GENET_RRING_REG(start_= addr) +#define BCM2838_GENET_RRING_RING_START_ADDR_HI BCM2838_GENET_RRING_REG(sta= rt_addr_hi) +#define BCM2838_GENET_RRING_RING_END_ADDR BCM2838_GENET_RRING_REG(end_addr) +#define BCM2838_GENET_RRING_RING_END_ADDR_HI BCM2838_GENET_RRING_REG(end_a= ddr_hi) +#define BCM2838_GENET_RRING_RING_MBUF_DONE_TRESH BCM2838_GENET_RRING_REG(m= buf_done_tresh) +#define BCM2838_GENET_RRING_RING_XON_XOFF_TRESH BCM2838_GENET_RRING_REG(xo= n_xoff_tresh) +#define BCM2838_GENET_RRING_RING_READ_PTR BCM2838_GENET_RRING_REG(read_ptr) +#define BCM2838_GENET_RRING_RING_READ_PTR_HI BCM2838_GENET_RRING_REG(read_= ptr_hi) + + +#define BCM2838_GENET_PHY_REG(reg) (offsetof(BCM2838GenetPhyRegs, reg= ) / 2) +#define BCM2838_GENET_PHY_BMCR BCM2838_GENET_PHY_REG(bmcr) +#define BCM2838_GENET_PHY_AUX_CTL BCM2838_GENET_PHY_REG(aux_ctl) +#define BCM2838_GENET_PHY_SHD BCM2838_GENET_PHY_REG(shd) +#define BCM2838_GENET_EXP_DATA BCM2838_GENET_PHY_REG(exp_data) +#define BCM2838_GENET_EXP_SEL BCM2838_GENET_PHY_REG(exp_ctrl) + #define BCM2838_GENET_PHY_AUX_CTL_MISC 0x7 #define BCM2838_GENET_PHY_AUX_CTL_REGS_SIZE 8 =20 --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459057; cv=none; d=zohomail.com; s=zohoarc; b=A+nGZDSdds4RhFttTQPIF4+HMORwP9mORFN149/t98zaalCVIialApLBtH3Hm2e8E7VTZ4IzPZWNeXGKpM3GHGfAn7iKAgBBpOsI3eIUi3YXfg0B3rH8Np64D4PVjpjWKPReUYdITc2Tn4amsoQT12OCbDc7+gy1454HTMx7YZQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459057; 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=/awn/fyk/BNWYmm6Q7Iu7ZxGO/DeIOJAJF1lrP09LdY=; b=GJEZ280KsWtx4HsPW4bo5gtQArh9VbfwlDg8zJjKuLMs32GCwOCzG/BaOYOoXfASkCfIv7BGXHTi/HV/Cft90iAoaJZZ/mfV2VdlrBqyce/Oc7MvtCDMxnmf/IMwv+d4KESqYwbr6/rySrs4dpA6lKZjo/cP2AC6E00xnB2x0kI= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459057772506.74704565669435; Tue, 11 Aug 2026 07:37:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnap-0000xN-PQ; Tue, 11 Aug 2026 10:36:39 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaQ-0000JR-Dk for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:19 -0400 Received: from mail-qv1-xf2e.google.com ([2607:f8b0:4864:20::f2e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaN-0001tw-Dv for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:13 -0400 Received: by mail-qv1-xf2e.google.com with SMTP id 6a1803df08f44-8f256eaedf8so29162356d6.2 for ; Tue, 11 Aug 2026 07:36:11 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.09 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458970; x=1787063770; 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:content-type; bh=/awn/fyk/BNWYmm6Q7Iu7ZxGO/DeIOJAJF1lrP09LdY=; b=Aq/dpB03ELLf+wYuHRadp4zaNYH8XKowSMX0PG50f19fGWM/IElltyBRd+B0tw3bzG JhkHTGl98MCdsDKoZgX+FUC/+mg9tye5e93NlLBxIDSgXi2AxF9sst9YX7IYfm2xWjf3 T5j6svPvP8WPsQ08A5LrhIf4bud2UU9nG63FH0uxK0inB0HVW0MV2T8SdCHT5CcpoKYO a6lTBmaYJOWk0IwSJhsdzUxy15rTr8sWASDJGkwr2Dwndq81qAhCgdi8/1z9CzOLLRXH XnKQZ7kL1Zb2uGvwPQKsd6DsMUlCuL9kocfoF7vktVdWAiS6hCA77CbmLaWWATP0PJqQ OxfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458970; x=1787063770; 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:content-type; bh=/awn/fyk/BNWYmm6Q7Iu7ZxGO/DeIOJAJF1lrP09LdY=; b=McaC5rEVODhVBG2bcueV6+vxPao0HLFWMC2EVrP+MivNlDx5iq8aa7y/1wQ6ZXQjxM EacMdgl+l0EbjGy5OYCFHFqB3kkldcecxpnm7LA49ujPyYkO3YGcLPLZ+1ziTCQPpDLx dE9ioaXWj0O2G5jA20bdfQ7nBcAtT1L2a/j0okHwotyMiRfLmLsYxOMZO5mSr56yAdtt LqKO0lgusBHhUlj36SjdQUuS4IY4ntz4S+JsKgDPeP+uifvEMtydhwikkboa9jbKGO5l P8njrxwgEbpz0GYL46z7+3AN9ThMI9kgPBmQf8VVfbQkAVeoH5Ltdf0g73EN3GMvAJrw ntUw== X-Gm-Message-State: AOJu0YywAPsYE6uDGpCutZoIabDKKMu93wafrbJpKoIWZiXud3DAU6rP qnAank3UI6eODmnMvSZ0gB53fFzOWyaIXE4kIVznAzyny8a2/j2GoGQOXR3sog== X-Gm-Gg: AR+sD10UgA/07SVl8truuVv8wxdqeizvyRs0qfY1tN9Oqon7A2eUHM2XunmJxfNcgen ozQSxTMLsaCXRx7goNKxdTtes6xvLO7LPA2tCqeyEE47+w7xMlksINw35nmREO5nVrFCffhq+Hq +lVExYNXZb9rucc4uANEJlL9tQICu8oYUrl4SzvQz7GKC1FVPnSHY6YTvSoNQ2PIZ36zxlSzpb+ 7bzpHmgR8bxR88yjS++9PtlfopRVjTu4FSbGdB0L8iFZ7QhKZPo3oTSGgzs1ykuFQLZu/R012hP CJpK5oqfPv754We/Hvo6H32w55tuW/m2kAgwIv+81qrGMf31edVh2nj/7tTCKUHepzcXPMKd9QE l0WyOJs58Esk0xMtxH5XkFZXyz3gaduM1jal0TJiYtLT5KOuTsUkYkzHLiTa7kKX2yfew+icU4P 483UmUHE2zyRcLbr0lUXww8gHxYLN8nnA6AhUaX6KBMCiIPKkChsC6bRaz2gJ7xV2ad1r6Cp0Nz sJ+8lpm9E089yIPNxAISbdKNyTd8Q== X-Received: by 2002:a05:6214:5d88:b0:90a:35f9:9694 with SMTP id 6a1803df08f44-90a66e53c80mr34457756d6.31.1786458970114; Tue, 11 Aug 2026 07:36:10 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 10/19] hw/net/bcm2838_genet: implement GENET register ops Date: Tue, 11 Aug 2026 10:35:47 -0400 Message-ID: <20260811143557.7862-11-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f2e; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf2e.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: 1786459059462158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Replace the stub MMIO read/write handlers with real dispatch over the register offsets from the previous patches: SYS revision control, INTRL0/1 status/mask registers, UMAC command/MAC-address/ MDIO-command registers, and TDMA/RDMA ring configuration, wired up to the NIC's realize()/reset() and qdev NIC properties (DEFINE_NIC_PROPERTIES) so the device gets a MAC address and peer netdev from the command line. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo: adapted to the current Property/class_init/Resettable APIs, with no functional change to the register dispatch logic itself. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 197 +++++++++++++++++++++++++++++++-- include/hw/net/bcm2838_genet.h | 2 + 2 files changed, 190 insertions(+), 9 deletions(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 2bc2a770b1..f3c5ca26c5 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -236,25 +236,151 @@ REG16(GENET_PHY_EXP_SEL, 0) FIELD(GENET_PHY_EXP_SEL, REG_ID, 0, 8) FIELD(GENET_PHY_EXP_SEL, BLOCK_ID, 8, 8) =20 +static void bcm2838_genet_set_qemu_mac(BCM2838GenetState *s) +{ + const MACAddr *addr =3D &s->nic_conf.macaddr; + + s->regs.umac.mac0 =3D FIELD_DP32(s->regs.umac.mac0, GENET_UMAC_MAC_0, + ADDR_0, addr->a[0]); + s->regs.umac.mac0 =3D FIELD_DP32(s->regs.umac.mac0, GENET_UMAC_MAC_0, + ADDR_1, addr->a[1]); + s->regs.umac.mac0 =3D FIELD_DP32(s->regs.umac.mac0, GENET_UMAC_MAC_0, + ADDR_2, addr->a[2]); + s->regs.umac.mac0 =3D FIELD_DP32(s->regs.umac.mac0, GENET_UMAC_MAC_0, + ADDR_3, addr->a[3]); + s->regs.umac.mac1 =3D FIELD_DP32(s->regs.umac.mac1, GENET_UMAC_MAC_1, + ADDR_4, addr->a[4]); + s->regs.umac.mac1 =3D FIELD_DP32(s->regs.umac.mac1, GENET_UMAC_MAC_1, + ADDR_5, addr->a[5]); +} + +static void bcm2838_genet_set_irq_default(BCM2838GenetState *s) +{ + uint32_t intrl_0_status =3D s->regs.intrl0.stat; + uint32_t intrl_0_mask =3D s->regs.intrl0.mask_status; + int level =3D (intrl_0_status & ~intrl_0_mask) =3D=3D 0 ? 0 : 1; + + qemu_set_irq(s->irq_default, level); +} + +static void bcm2838_genet_set_irq_prio(BCM2838GenetState *s) +{ + uint32_t intrl_1_status =3D s->regs.intrl1.stat; + uint32_t intrl_1_mask =3D s->regs.intrl1.mask_status; + int level =3D (intrl_1_status & ~intrl_1_mask) =3D=3D 0 ? 0 : 1; + + qemu_set_irq(s->irq_prio, level); +} + static uint64_t bcm2838_genet_read(void *opaque, hwaddr offset, unsigned s= ize) { uint64_t value =3D ~0; + BCM2838GenetState *s =3D opaque; =20 - qemu_log_mask( - LOG_GUEST_ERROR, - "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", - __func__, size, offset); + if (offset + size < sizeof(s->regs)) { + memcpy(&value, (uint8_t *)&s->regs + offset, size); + } else { + qemu_log_mask( + LOG_GUEST_ERROR, + "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", + __func__, size, offset); + } =20 trace_bcm2838_genet_read(size, offset, value); return value; } =20 static void bcm2838_genet_write(void *opaque, hwaddr offset, uint64_t valu= e, - unsigned size) { - qemu_log_mask( - LOG_GUEST_ERROR, - "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", - __func__, size, offset); + unsigned size) +{ + BCM2838GenetState *s =3D opaque; + MACAddr *mac =3D &s->nic_conf.macaddr; + NetClientState *ncs =3D qemu_get_queue(s->nic); + + trace_bcm2838_genet_write(size, offset, value); + + if (offset + size < sizeof(s->regs)) { + switch (offset) { + case BCM2838_GENET_INTRL0_SET: + s->regs.intrl0.stat |=3D value; + break; + case BCM2838_GENET_INTRL0_CLEAR: + s->regs.intrl0.stat &=3D ~value; + break; + case BCM2838_GENET_INTRL0_MASK_SET: + s->regs.intrl0.mask_status |=3D value; + break; + case BCM2838_GENET_INTRL0_MASK_CLEAR: + s->regs.intrl0.mask_status &=3D ~value; + break; + case BCM2838_GENET_INTRL1_SET: + s->regs.intrl1.stat |=3D value; + break; + case BCM2838_GENET_INTRL1_CLEAR: + s->regs.intrl1.stat &=3D ~value; + break; + case BCM2838_GENET_INTRL1_MASK_SET: + s->regs.intrl1.mask_status |=3D value; + break; + case BCM2838_GENET_INTRL1_MASK_CLEAR: + s->regs.intrl1.mask_status &=3D ~value; + break; + case BCM2838_GENET_UMAC_CMD: + /* Complete SW reset as soon as it has been requested */ + if (FIELD_EX32(value, GENET_UMAC_CMD, SW_RESET) =3D=3D 1) { + device_cold_reset(DEVICE(s)); + value =3D FIELD_DP32(value, GENET_UMAC_CMD, SW_RESET, 0); + } + break; + /* + * TODO: before changing MAC address we'd better inform QEMU + * network subsystem about freeing previously used one, but + * qemu_macaddr_set_free function isn't accessible for us (marked + * as static in net/net.c), see also https://lists.nongnu.org/ + * archive/html/qemu-devel/2022-07/msg02123.html + */ + case BCM2838_GENET_UMAC_MAC0: + mac->a[0] =3D FIELD_EX32(value, GENET_UMAC_MAC_0, ADDR_0); + mac->a[1] =3D FIELD_EX32(value, GENET_UMAC_MAC_0, ADDR_1); + mac->a[2] =3D FIELD_EX32(value, GENET_UMAC_MAC_0, ADDR_2); + mac->a[3] =3D FIELD_EX32(value, GENET_UMAC_MAC_0, ADDR_3); + qemu_macaddr_default_if_unset(mac); + qemu_format_nic_info_str(ncs, mac->a); + trace_bcm2838_genet_mac_address(ncs->info_str); + break; + case BCM2838_GENET_UMAC_MAC1: + mac->a[4] =3D FIELD_EX32(value, GENET_UMAC_MAC_1, ADDR_4); + mac->a[5] =3D FIELD_EX32(value, GENET_UMAC_MAC_1, ADDR_5); + qemu_macaddr_default_if_unset(mac); + qemu_format_nic_info_str(ncs, mac->a); + trace_bcm2838_genet_mac_address(ncs->info_str); + break; + case BCM2838_GENET_RDMA_CTRL: + s->regs.rdma.status =3D (~value) & GENET_DMA_ENABLE_MASK; + break; + case BCM2838_GENET_UMAC_MDIO_CMD: + case BCM2838_GENET_TDMA_REGS + ... BCM2838_GENET_TDMA_REGS + sizeof(BCM2838GenetRegsTdma) - 1: + qemu_log_mask(LOG_UNIMP, + "UMAC MDIO and TDMA aren't implemented yet"); + break; + default: + break; + } + + memcpy((uint8_t *)&s->regs + offset, &value, size); + if (offset =3D=3D BCM2838_GENET_RDMA_CTRL && + FIELD_EX32(value, GENET_DMA_CTRL, EN)) { + qemu_flush_queued_packets(ncs); + } + bcm2838_genet_set_irq_default(s); + bcm2838_genet_set_irq_prio(s); + } else { + qemu_log_mask( + LOG_GUEST_ERROR, + "%s: out-of-range access, %u bytes @ offset 0x%04" PRIx64 "\n", + __func__, size, offset); + } } =20 static const MemoryRegionOps bcm2838_genet_ops =3D { @@ -265,9 +391,14 @@ static const MemoryRegionOps bcm2838_genet_ops =3D { .valid =3D {.min_access_size =3D 4}, }; =20 +static NetClientInfo bcm2838_genet_client_info =3D { + .type =3D NET_CLIENT_DRIVER_NIC, + .size =3D sizeof(NICState) +}; =20 static void bcm2838_genet_realize(DeviceState *dev, Error **errp) { + NetClientState *ncs; BCM2838GenetState *s =3D BCM2838_GENET(dev); SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); =20 @@ -275,10 +406,46 @@ static void bcm2838_genet_realize(DeviceState *dev, E= rror **errp) memory_region_init_io(&s->regs_mr, OBJECT(s), &bcm2838_genet_ops, s, "bcm2838_genet_regs", sizeof(s->regs)); sysbus_init_mmio(sbd, &s->regs_mr); + + /* QEMU-managed NIC (host network back-end connection) */ + qemu_macaddr_default_if_unset(&s->nic_conf.macaddr); + s->nic =3D qemu_new_nic(&bcm2838_genet_client_info, &s->nic_conf, + object_get_typename(OBJECT(dev)), dev->id, + &dev->mem_reentrancy_guard, s); + bcm2838_genet_set_qemu_mac(s); + ncs =3D qemu_get_queue(s->nic); + qemu_format_nic_info_str(ncs, s->nic_conf.macaddr.a); + trace_bcm2838_genet_mac_address(ncs->info_str); + + /* Interrupts */ + sysbus_init_irq(sbd, &s->irq_default); + sysbus_init_irq(sbd, &s->irq_prio); + + /* DMA space */ + address_space_init(&s->dma_as, get_system_memory(), "bcm2838_genet_dma= "); } =20 static void bcm2838_genet_phy_reset(BCM2838GenetState *s) { + memset(&s->phy_regs, 0x00, sizeof(s->phy_regs)); + memset(&s->phy_shd_regs, 0x00, sizeof(s->phy_shd_regs)); + memset(&s->phy_aux_ctl_shd_regs, 0x00, sizeof(s->phy_aux_ctl_shd_regs)= ); + + /* All values below were taken from real HW trace and logs */ + s->phy_regs.bmcr =3D 0x1140; + s->phy_regs.bmsr =3D 0x7949; + s->phy_regs.sid1 =3D 0x600D; + s->phy_regs.sid2 =3D 0x84A2; + s->phy_regs.advertise =3D 0x01E1; + s->phy_regs.ctrl1000 =3D 0x0200; + s->phy_regs.estatus =3D 0x3000; + + s->phy_shd_regs.clk_ctl =3D 0x0200; + s->phy_shd_regs.scr3 =3D 0x001F; + s->phy_shd_regs.apd =3D 0x0001; + + s->phy_aux_ctl_shd_regs.misc =3D 0x1E; + trace_bcm2838_genet_phy_reset("done"); } =20 @@ -288,11 +455,22 @@ static void bcm2838_genet_reset(Object *obj, ResetTyp= e type) =20 memset(&s->regs, 0x00, sizeof(s->regs)); =20 + s->regs.sys.rev_ctrl =3D FIELD_DP32(s->regs.sys.rev_ctrl, GENET_SYS_RE= V_CTRL, + MAJOR_REV, BCM2838_GENET_REV_MAJOR); + s->regs.sys.rev_ctrl =3D FIELD_DP32(s->regs.sys.rev_ctrl, GENET_SYS_RE= V_CTRL, + MINOR_REV, BCM2838_GENET_REV_MINOR); + s->regs.rdma.status =3D GENET_DMA_ENABLE_MASK; + s->regs.tdma.status =3D GENET_DMA_ENABLE_MASK; + trace_bcm2838_genet_reset("done"); =20 bcm2838_genet_phy_reset(s); } =20 +static const Property genet_properties[] =3D { + DEFINE_NIC_PROPERTIES(BCM2838GenetState, nic_conf), +}; + static void bcm2838_genet_class_init(ObjectClass *class, const void *data) { static ResettablePhases unused_parent_phases; @@ -302,6 +480,7 @@ static void bcm2838_genet_class_init(ObjectClass *class= , const void *data) dc->realize =3D bcm2838_genet_realize; resettable_class_set_parent_phases(rc, NULL, bcm2838_genet_reset, NULL, &unused_parent_phases); + device_class_set_props(dc, genet_properties); } =20 static const TypeInfo bcm2838_genet_info =3D { diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index b9895933b6..e3dee5a78f 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -390,6 +390,8 @@ struct BCM2838GenetState { SysBusDevice parent_obj; =20 /*< public >*/ + NICState *nic; + NICConf nic_conf; =20 MemoryRegion regs_mr; AddressSpace dma_as; --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459145; cv=none; d=zohomail.com; s=zohoarc; b=kdsnsyyC2Mdd1pZYTr/Ps289uVl58wczlLl7GJYTgSoXfQd9tMhuqKb2kkgbrAjRuQ3v7lnbWo1CcZ4hoPc1zcjDqsN/jffY+flh88p7ZuPX8ALWkpy26MT/bIsRU9+9g2go+EdIqLWstZU17N58Qxkjb3prh5DFgbxt7Mj5Nu8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459145; 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=OGoStqbTXl1+5zbTnB096+yyVJftazOPajkXASjjf08=; b=PhdDJIsZFhXJuvGK9b/OeaTqDZTUKTVSgL3d1Yfusfe2Wzzukt3XS8SIcS5mxxWBMWtGoE7c9JgXoEZobk2jqBKCumAvyea3QwjOmieBtHE41j30q3oV89X53O7NXF40e4W9KeCMUFS5kwR/GQCMa9M9FYOIff01aUrdrbarUZI= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459145443755.7987193237325; Tue, 11 Aug 2026 07:39:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnao-0000nV-18; Tue, 11 Aug 2026 10:36:38 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaR-0000JZ-JQ for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:19 -0400 Received: from mail-qv1-xf35.google.com ([2607:f8b0:4864:20::f35]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaO-0001uI-CK for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:15 -0400 Received: by mail-qv1-xf35.google.com with SMTP id 6a1803df08f44-8efcef23d21so22077966d6.2 for ; Tue, 11 Aug 2026 07:36:12 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.10 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458971; x=1787063771; 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:content-type; bh=OGoStqbTXl1+5zbTnB096+yyVJftazOPajkXASjjf08=; b=J+mM2Wzcs0FpaZdKyb+xfbc57Yx5/VAzfFchGj7K0sI1gCJyw1JP51+V/g82/CynCb 60aCPPX5PVPkiQeAfOgmKKPT8ubh08chtUMM1MOQzSPSDclMa2hD8qE4Ky65wNomiT1e LDFpwKhDyoMsUQYtFnfriT178meO7JvFeffubq5JwHKmUz3WZevWlzUcUTqIhZyJOSW8 jll/1PQmvsO+3jW3jHVzTPkiDeDJl/duGgE4HeUYNvjeK1S5YSuLYafxbDPxMjdRW0nI qpsW38nilEPZhPuFKNI1PXQIBSx5ZpLZ2Fc5DHn2DlLPa5efd5YBh7+LXFGu3CBp9Ycj a5ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458971; x=1787063771; 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:content-type; bh=OGoStqbTXl1+5zbTnB096+yyVJftazOPajkXASjjf08=; b=bQ3Mpn2cCq/kKMjbMaNRbiIDzWSMRvumsJPWpUBq8GXKJjGbbtrqWvWW1GVwx9aZep tqyClc5/uO6+VsZjYsILCSLFciGQzxY6wVvA4adyZlgSnYNE+bTItlb9Xq6xMd5jRy2Z 8rpYPzvGjOz/lq5BwPLeCOUIcSEBZh599RXIWmYY0TURx7Hid6o736OBuvfHM3BPsinq ayMxVR50nDAj5Y8Fu53ZKu/juSa+b/ZwvFUhwVdVUWx5gvEGbI6yd68jhA7UeUFFnd/8 uUeooWbFOmPawsuDWi/PCR7YWqeJDaGKO0+lWDOnTiX2Q+m4ObF2ngnaFw4KE1KSbq8F psJw== X-Gm-Message-State: AOJu0YxIhcRSfZEfh3wo544LQ75IMFex0njatmJUmxuH/1KPMi8C1fU4 a4l9g5QTX42n36h5bbTdScz3bWSsVeSFfAN45/NtOLEVwi5w7MQNOojT11Q6+g== X-Gm-Gg: AR+sD10CKPExmkkhOZg0eauugwBhBTN7NMkaxdvBkJrFbEdw3V7kz8vYeRjEIRMaQ0X B01TJ/qk6IsLJs8iau9cM29OrfzYk1/uLWsuzvIHAvOwmD5lVAFW25iaEntlPQJD0Q0Vsmzvq02 rzbcA5JrB+W9+4vBAIM3XGmZ6GLhwlU+/A1MNUF7BGRiuVY+wuPO5BZ/5Uyg1uWrFHIJDlDbIZU L77O48SNJ0v4arfNNsAK5UutxdvAkNPPI1kUoJ/VQZvXD9oK+SnI6SJk8l6dSvjV78kbsiEJsEs 5QNNKe9jx1sn0Z6jp9L5fsBumBGn/8qMM5Ed8YsTOS2NSXjM1A9ADn0aQjgFZFXy8EKVYmdUSxa 7xz2iPWlukUN468s8PwOqJEV+Eji+ccLHcW2bKnbbFlx74ddDBKg5BkVBAodsCdDJHocF/owoQJ iH1lfE0YX1lbYDEITUMgqV05lj+SgV3tjjeSNKwaR2tpgnk8fu9Hbc151ZdpyBUd3HTm+lz5eUS oXam+QRga4fSULoOqc= X-Received: by 2002:a05:6214:ac9:b0:907:c056:d648 with SMTP id 6a1803df08f44-90a667e9284mr36411556d6.2.1786458971236; Tue, 11 Aug 2026 07:36:11 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 11/19] hw/net/bcm2838_genet: implement GENET MDIO Date: Tue, 11 Aug 2026 10:35:48 -0400 Message-ID: <20260811143557.7862-12-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f35; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf35.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: 1786459147914158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Implement the MDIO command register handling used to read/write the BCM54213PE PHY's standard MII registers (BMCR, BMSR, LPA, ...) plus its vendor "shadow" register blocks reached through the AUX_CTL/ EXP_SHD indirection scheme, and a simple link-state model (PHY starts down, comes up once BMCR is programmed and autonegotiation is (re)started). Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo; see the following "Fix GENET PHY autonegotiation-restart deadlock" patch for a real bug found and fixed in this code during testing. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 132 ++++++++++++++++++++++++++++++++- include/hw/net/bcm2838_genet.h | 3 +- 2 files changed, 132 insertions(+), 3 deletions(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index f3c5ca26c5..6b3c9cb12b 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -216,6 +216,7 @@ FIELD(GENET_PHY_STAT_1000, LOCALRXOK, 13, 1) FIELD(GENET_PHY_STAT_1000, MSRES, 14, 1) FIELD(GENET_PHY_STAT_1000, MSFAIL, 15, 1) =20 +/* There are two data representations for PHY_AUX_CTRL register */ REG16(GENET_PHY_AUX_CTRL_0, 0) FIELD(GENET_PHY_AUX_CTRL_0, REG_ID_MASK, 0, 3) FIELD(GENET_PHY_AUX_CTRL_0, RSVD_3, 3, 1) @@ -272,6 +273,129 @@ static void bcm2838_genet_set_irq_prio(BCM2838GenetSt= ate *s) qemu_set_irq(s->irq_prio, level); } =20 +static void bcm2838_genet_phy_aux_ctl_write(BCM2838GenetState *s, + uint16_t value) +{ + uint16_t reg_id =3D FIELD_EX16(value, GENET_PHY_AUX_CTRL_0, REG_ID); + uint16_t reg_id_mask =3D FIELD_EX16(value, GENET_PHY_AUX_CTRL_0, REG_I= D_MASK); + uint16_t misc_wren =3D FIELD_EX16(value, GENET_PHY_AUX_CTRL_0, MISC_WR= EN); + uint16_t reg_data =3D FIELD_EX16(value, GENET_PHY_AUX_CTRL_0, REG_DATA= ); + uint16_t reg_data12 =3D FIELD_EX16(value, GENET_PHY_AUX_CTRL_1, REG_DA= TA); + + uint16_t *phy_aux_ctl_shd_reg_id =3D + (uint16_t *)&s->phy_aux_ctl_shd_regs + reg_id; + uint16_t *phy_aux_ctl_shd_reg_id_mask =3D + (uint16_t *)&s->phy_aux_ctl_shd_regs + reg_id_mask; + + if (reg_id_mask =3D=3D BCM2838_GENET_PHY_AUX_CTL_MISC) { + if (reg_id =3D=3D BCM2838_GENET_PHY_AUX_CTL_MISC) { + if (misc_wren =3D=3D 0) { + /* write for subsequent read (8-bit from AUX_CTL_MISC) */ + FIELD_DP16(value, GENET_PHY_AUX_CTRL_0, REG_DATA, + *phy_aux_ctl_shd_reg_id); + } else { + /* write 8 bits to AUX_CTL_MISC */ + *phy_aux_ctl_shd_reg_id_mask =3D reg_data; + } + } else { + /* write for subsequent read (12-bit) */ + FIELD_DP16(value, GENET_PHY_AUX_CTRL_1, REG_DATA, + *phy_aux_ctl_shd_reg_id); + } + } else { + /* write 12 bits */ + *phy_aux_ctl_shd_reg_id_mask =3D reg_data12; + } + + s->phy_regs.aux_ctl =3D value; +} + +static void bcm2838_genet_phy_shadow_write(BCM2838GenetState *s, + uint16_t value) +{ + uint16_t reg_id =3D FIELD_EX16(value, GENET_PHY_SHADOW, REG_ID); + uint16_t wr =3D FIELD_EX16(value, GENET_PHY_SHADOW, WR); + uint16_t reg_data =3D FIELD_EX16(value, GENET_PHY_SHADOW, REG_DATA); + + uint16_t *phy_shd_reg =3D (uint16_t *)&s->phy_shd_regs + reg_id; + + if (wr =3D=3D 0) { + FIELD_DP16(value, GENET_PHY_SHADOW, REG_DATA, *phy_shd_reg); + } else { + *phy_shd_reg =3D reg_data; + } + + s->phy_regs.shd =3D value; +} + +static void bcm2838_genet_phy_exp_shadow_write(BCM2838GenetState *s, + uint16_t value) +{ + /* + * TODO Stub implementation without side effect, + * just storing registers values + */ + uint16_t reg_id =3D FIELD_EX16(s->phy_regs.exp_ctrl, + GENET_PHY_EXP_SEL, REG_ID); + uint16_t block_id =3D FIELD_EX16(s->phy_regs.exp_ctrl, + GENET_PHY_EXP_SEL, BLOCK_ID); + + s->phy_exp_shd_regs.regs[block_id][reg_id] =3D value; +} + +static uint16_t bcm2838_genet_phy_exp_shadow_read(BCM2838GenetState *s) +{ + uint16_t reg_id =3D FIELD_EX16(s->phy_regs.exp_ctrl, + GENET_PHY_EXP_SEL, REG_ID); + uint16_t block_id =3D FIELD_EX16(s->phy_regs.exp_ctrl, + GENET_PHY_EXP_SEL, BLOCK_ID); + + return s->phy_exp_shd_regs.regs[block_id][reg_id]; +} + +static uint64_t bcm2838_genet_mdio_cmd(BCM2838GenetState *s, uint64_t cmd) +{ + uint32_t phy_reg_id =3D FIELD_EX32(cmd, GENET_UMAC_MDIO_CMD, REG_ID); + uint32_t phy_reg_data =3D FIELD_EX32(cmd, GENET_UMAC_MDIO_CMD, REG_DAT= A); + uint32_t start_busy =3D FIELD_EX32(cmd, GENET_UMAC_MDIO_CMD, START_BUS= Y); + uint32_t rd =3D FIELD_EX32(cmd, GENET_UMAC_MDIO_CMD, RD); + uint32_t wr =3D FIELD_EX32(cmd, GENET_UMAC_MDIO_CMD, WR); + uint16_t *phy_reg =3D (uint16_t *)&s->phy_regs + phy_reg_id; + + uint16_t anrestart =3D FIELD_EX16(phy_reg_data, GENET_PHY_BMCR, ANREST= ART); + + if (start_busy !=3D 0) { + cmd =3D FIELD_DP32(cmd, GENET_UMAC_MDIO_CMD, START_BUSY, 0); + + if (rd !=3D 0) { + if (phy_reg_id =3D=3D BCM2838_GENET_EXP_DATA) { + cmd =3D FIELD_DP32(cmd, GENET_UMAC_MDIO_CMD, REG_DATA, + bcm2838_genet_phy_exp_shadow_read(s)); + } else { + cmd =3D FIELD_DP32(cmd, GENET_UMAC_MDIO_CMD, REG_DATA, *ph= y_reg); + } + } else if (wr !=3D 0) { + if (phy_reg_id =3D=3D BCM2838_GENET_PHY_AUX_CTL) { + bcm2838_genet_phy_aux_ctl_write(s, phy_reg_data); + } else if (phy_reg_id =3D=3D BCM2838_GENET_PHY_SHD) { + bcm2838_genet_phy_shadow_write(s, phy_reg_data); + } else if (phy_reg_id =3D=3D BCM2838_GENET_EXP_DATA) { + bcm2838_genet_phy_exp_shadow_write(s, phy_reg_data); + } else { + if (phy_reg_id =3D=3D BCM2838_GENET_PHY_BMCR) { + /* Initiate auto-negotiation once it has been restarte= d */ + if (anrestart =3D=3D 1) { + FIELD_DP16(phy_reg_data, GENET_PHY_BMCR, ANRESTART= , 0); + } + } + *phy_reg =3D phy_reg_data; + } + } + } + + return cmd; +} + static uint64_t bcm2838_genet_read(void *opaque, hwaddr offset, unsigned s= ize) { uint64_t value =3D ~0; @@ -359,10 +483,13 @@ static void bcm2838_genet_write(void *opaque, hwaddr = offset, uint64_t value, s->regs.rdma.status =3D (~value) & GENET_DMA_ENABLE_MASK; break; case BCM2838_GENET_UMAC_MDIO_CMD: + value =3D bcm2838_genet_mdio_cmd(s, value); + s->regs.intrl0.stat =3D FIELD_DP32(s->regs.intrl0.stat, + GENET_INTRL_0, MDIO_DONE, 1); + break; case BCM2838_GENET_TDMA_REGS ... BCM2838_GENET_TDMA_REGS + sizeof(BCM2838GenetRegsTdma) - 1: - qemu_log_mask(LOG_UNIMP, - "UMAC MDIO and TDMA aren't implemented yet"); + qemu_log_mask(LOG_UNIMP, "TDMA isn't implemented yet"); break; default: break; @@ -464,6 +591,7 @@ static void bcm2838_genet_reset(Object *obj, ResetType = type) =20 trace_bcm2838_genet_reset("done"); =20 + bcm2838_genet_set_qemu_mac(s); bcm2838_genet_phy_reset(s); } =20 diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index e3dee5a78f..b34c4b3ce7 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -103,7 +103,8 @@ OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_G= ENET) #define BCM2838_GENET_EXP_DATA BCM2838_GENET_PHY_REG(exp_data) #define BCM2838_GENET_EXP_SEL BCM2838_GENET_PHY_REG(exp_ctrl) =20 -#define BCM2838_GENET_PHY_AUX_CTL_MISC 0x7 +#define BCM2838_GENET_PHY_AUX_CTL_AUXCTL 0x0 +#define BCM2838_GENET_PHY_AUX_CTL_MISC 0x7 #define BCM2838_GENET_PHY_AUX_CTL_REGS_SIZE 8 =20 #define BCM2838_GENET_PHY_EXP_SHD_BLOCKS_CNT 256 --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459171; cv=none; d=zohomail.com; s=zohoarc; b=JxNiZ7pM1DwsE4wEEMo8Arup7gg7Y3mKeyp01NYuHDddxLJLha1qazkfZ1wIDvIeMs40/e8/XGqHhukr5cmtwvivUa+2LbOsEvMOpJ2B+BAnv09m2+mrAgVG9WOLT3fO1ujXDE6+lLksjixz0aLiKXFCzM4utXGROa5IOo+XdZ8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459171; 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=zAGkNDzZ3qi7+HUhU7T8RpYQbvTHCFyX1QLR0SeeZn8=; b=Hrwn0SJocnYZUkFZftwupLom2sev8k06pBIIXrbzFvEVeIdiyz83J9b5FiQvYwWRp/BdgZH6TaLNbWyUArEZxgzf51JBeXK4eYUhE07KLFxjkrAwqyhlAltgqxS+NS/bR+QnJuvH8hw+w9mmxcE4Wl/PjFVgefXSpDK13b27LVc= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459171289817.8341978905607; Tue, 11 Aug 2026 07:39:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnar-00013w-Mq; Tue, 11 Aug 2026 10:36:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaS-0000Jm-6z for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:21 -0400 Received: from mail-qv1-xf36.google.com ([2607:f8b0:4864:20::f36]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaQ-0001uZ-4K for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:15 -0400 Received: by mail-qv1-xf36.google.com with SMTP id 6a1803df08f44-8efcfdb2b43so23119626d6.3 for ; Tue, 11 Aug 2026 07:36:13 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.11 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458973; x=1787063773; 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:content-type; bh=zAGkNDzZ3qi7+HUhU7T8RpYQbvTHCFyX1QLR0SeeZn8=; b=N7vLBuorRM/k5/M5og6vbwDSiNSjDg2S7XNS4SU+ho95mqK7oSu1AATjG4mj85LZEd FwF1DkzpRmUXdhYNKjENXSRDJbRY1VyWfcaxwl99w5Qe5Dn0BHtS2xZHvmjKARhifuhz 1z4jlzK5VpQ7eLfHKUYBnJar5YDVTr2ByGUOboMdq18a7tcm9qNDlsBTwrLNE4IaGMJ4 0a/fMDh/34sl+jmbT+I3SPrT5RrZncFKr0bn0QH4sIp0oXBQZYRCGygaBnADNRIMj8bA dOihI3eM3xDdxTtFrEMnHvppdFtW5AiAeKZRceTr2XXdRhwkz6+9RfctKIvJhaAHFROt ukHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458973; x=1787063773; 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:content-type; bh=zAGkNDzZ3qi7+HUhU7T8RpYQbvTHCFyX1QLR0SeeZn8=; b=a0+n5oG3VBgBFqc+ncvZvxt3vwwgpwm8EVBihqpmvIomXhU5joSEacwD50upq9sTLv jm4Tp+74OJb2GgUIIpNtbVHs/un7M7JmIakA/gUoMgqISPbn50TPa3lZzdQgMbGBvAWn URLOyvzq164Rs6gGbkqbQzKXtpmlQoJA9ZzD9aBJgLkqbHGoHOchdZLcAF8R47aD1HQo UL8sqRNULY2/79NLHVvgKzOw2XBWtLiJvLw1MV3qNeIpra6hPEGxm2Xg+n5QaEkeDCJ9 ckSalEVE7jTQLyrA/nlBm6otx5xe3J2uR8jLJkspZBHUxJQGwwut/PkPqMign+VMB6Ne 3Yfg== X-Gm-Message-State: AOJu0Yxou3NugkY+9woh6pGqmB+JwCAzxOxSl/tUkLg3ydsAZMG9YWc0 5fS/GYHhOgRgvOtQcX5pAlEU1lE1R7glNnaDTnGzxkWJwAX1ozHrzzNUyeYTkg== X-Gm-Gg: AR+sD13U6dFQdy2pqtZdrT6ktF8xjVdrVG5fnmp+4+RAYXd4l77ysY5iPxocrFqVtu8 w0vddYJT/DFdWnEf4GE9o0m7K/9FtoYtY/SphSRhNjYt4o3lKQ4lqv6KqENe+4l1C5qsKayAR2h kw1NtNfsFFnhn7HvJtSiXrDNL3LrisRsn6RPHkp/DpPNYjtc3YRjy3ngDXd3FfBGBOvmbumbzaF qFAZ5eAgm4wI80XYjABf2781b/SurRRFZHWl8UIPkFhhJ2fv3KvPvwuswbYLvm+I9VxJhqX0hcn d9+8/3SRqVNUyzPgNGCbTLQAXaikSXBfQ8POEr3JVbiq9x/mfdO8IcsG36ndkLR0SsjFQdZqxhz bMpyriKHRe138qmaXFlUdDHc1QUWKYLeO2KhDQhLX9NpJ+JSaMeHp0EUG/cxMlSGSsVys2hoUyq B60+nl942wDtMP8KwL6aVI4TK3v1EoNmBBZZ5ziW/yaKvTnuMXfrTvaVgNxXz8Dz2B2OwPh0f3k ZkpaQNbF41F7+11h/YA X-Received: by 2002:a05:6214:e4f:b0:8f0:afa3:594e with SMTP id 6a1803df08f44-90a66dfb43emr31167506d6.8.1786458972370; Tue, 11 Aug 2026 07:36:12 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 12/19] hw/net/bcm2838_genet: implement GENET TX path Date: Tue, 11 Aug 2026 10:35:49 -0400 Message-ID: <20260811143557.7862-13-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f36; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf36.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: 1786459172281158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Implement the transmit DMA ring handling: walk TX descriptors between the consumer and producer index for a ring, pull frame data out of guest memory, and hand completed frames to the netdev peer via qemu_send_packet(), advancing the consumer index and raising the TXDMA_MBDONE interrupt as descriptors complete. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo; see the later "Fix TX ring activation check" patch for a real bug found and fixed in the ring-activity check this path depends on. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 219 ++++++++++++++++++++++++++++++++- include/hw/net/bcm2838_genet.h | 17 +++ 2 files changed, 235 insertions(+), 1 deletion(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 6b3c9cb12b..1b02876094 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -237,6 +237,13 @@ REG16(GENET_PHY_EXP_SEL, 0) FIELD(GENET_PHY_EXP_SEL, REG_ID, 0, 8) FIELD(GENET_PHY_EXP_SEL, BLOCK_ID, 8, 8) =20 +REG32(GENET_TX_CSUM_INFO, 0) +FIELD(GENET_TX_CSUM_INFO, OFFSET, 0, 15) +FIELD(GENET_TX_CSUM_INFO, PROTO_UDP, 15, 1) +FIELD(GENET_TX_CSUM_INFO, START, 16, 15) +FIELD(GENET_TX_CSUM_INFO, LV, 30, 1) + + static void bcm2838_genet_set_qemu_mac(BCM2838GenetState *s) { const MACAddr *addr =3D &s->nic_conf.macaddr; @@ -396,6 +403,216 @@ static uint64_t bcm2838_genet_mdio_cmd(BCM2838GenetSt= ate *s, uint64_t cmd) return cmd; } =20 +static void bcm2838_genet_xmit_packet(NetClientState *s, void *packet, + size_t size) +{ + uint8_t *buf =3D packet + sizeof(BCM2838GenetXmitStatus); + size_t len =3D size; + uint16_t len_type =3D 0; + + len -=3D sizeof(BCM2838GenetXmitStatus); + net_checksum_calculate(buf, len, CSUM_ALL); + + memcpy(&len_type, &buf[12], sizeof(len_type)); + len_type =3D ntohs(len_type); + if (len_type < MAX_PAYLOAD_SIZE) { + len_type =3D len; + len_type =3D htons(len_type); + memcpy(&buf[12], &len_type, sizeof(len_type)); + } + + qemu_send_packet(s, buf, len); +} + +static uint64_t bcm2838_genet_tx(BCM2838GenetState *s, unsigned int ring_i= ndex, + uint32_t prod_index, + uint32_t cons_index) +{ + const unsigned int DESC_SIZE_WORDS + =3D sizeof(BCM2838GenetTdmaDesc) / sizeof(uint32_t); + const uint64_t RING_START_ADDR + =3D ((uint64_t)s->regs.tdma.rings[ring_index].start_addr_hi << 32) + + s->regs.tdma.rings[ring_index].start_addr; + const uint64_t RING_END_ADDR + =3D ((uint64_t)s->regs.tdma.rings[ring_index].end_addr_hi << 32) + + s->regs.tdma.rings[ring_index].end_addr; + + hwaddr data_addr; + uint64_t desc_index; + uint32_t desc_status =3D 0; + uint32_t buflength =3D 0; + uint64_t num_descs =3D 0; + uint64_t read_ptr + =3D ((uint64_t)s->regs.tdma.rings[ring_index].read_ptr_hi << 32) + + s->regs.tdma.rings[ring_index].read_ptr; + off_t packet_off =3D 0; + + uint32_t prod_index_fld =3D FIELD_EX32(prod_index, + GENET_DMA_PROD_INDEX, INDEX); + uint32_t cons_index_fld =3D FIELD_EX32(cons_index, + GENET_DMA_CONS_INDEX, INDEX); + + while (cons_index_fld !=3D prod_index_fld) { + desc_index =3D read_ptr / DESC_SIZE_WORDS; + if (desc_index >=3D BCM2838_GENET_DMA_DESC_CNT) { + qemu_log_mask( + LOG_GUEST_ERROR, + "%s: invalid TX descriptor index %" PRIu64 " (exceeds %u)\= n", + __func__, desc_index, BCM2838_GENET_DMA_DESC_CNT - 1); + break; + } + desc_status =3D s->regs.tdma.descs[desc_index].length_status; + data_addr =3D ((uint64_t)s->regs.tdma.descs[desc_index].address_hi= << 32) + + s->regs.tdma.descs[desc_index].address_lo; + trace_bcm2838_genet_tx(ring_index, desc_index, desc_status, + data_addr); + + if (FIELD_EX32(desc_status, GENET_RDMA_LENGTH_STATUS, SOP) !=3D 0)= { + packet_off =3D 0; + } + + buflength =3D FIELD_EX32(desc_status, + GENET_RDMA_LENGTH_STATUS, BUFLENGTH); + + /* TODO: Add address_space_read() return value check */ + address_space_read(&s->dma_as, data_addr, + MEMTXATTRS_UNSPECIFIED, + s->tx_packet + packet_off, + buflength); + packet_off +=3D buflength; + + if (FIELD_EX32(desc_status, GENET_RDMA_LENGTH_STATUS, EOP) !=3D 0)= { + bcm2838_genet_xmit_packet(qemu_get_queue(s->nic), s->tx_packet, + packet_off); + packet_off =3D 0; + } + + num_descs++; + cons_index_fld++; + s->regs.tdma.descs[desc_index].length_status =3D + FIELD_DP32(s->regs.tdma.descs[desc_index].length_status, + GENET_RDMA_LENGTH_STATUS, OWN, 1); + read_ptr =3D read_ptr =3D=3D RING_END_ADDR + 1 - DESC_SIZE_WORDS + ? RING_START_ADDR : read_ptr + DESC_SIZE_WORDS; + } + + s->regs.tdma.rings[ring_index].read_ptr =3D read_ptr; + s->regs.tdma.rings[ring_index].read_ptr_hi =3D read_ptr >> 32; + + return num_descs; +} + +static bool bcm2838_genet_tdma_ring_active(BCM2838GenetState *s, + unsigned int ring_index) +{ + uint32_t ctrl_reg =3D s->regs.tdma.ctrl; + uint32_t ring_cfg_reg =3D s->regs.tdma.ring_cfg; + uint32_t ring_mask =3D 1 << ring_index; + bool dma_en =3D FIELD_EX32(ctrl_reg, GENET_DMA_CTRL, EN) !=3D 0; + bool ring_en =3D + (FIELD_EX32(ring_cfg_reg, GENET_DMA_CTRL, EN) & ring_mask) !=3D 0; + bool ring_buf_en =3D + (FIELD_EX32(ctrl_reg, GENET_DMA_CTRL, RING_BUF_EN) & ring_mask) != =3D 0; + bool active =3D dma_en && ring_en && ring_buf_en; + + trace_bcm2838_genet_tx_dma_ring_active(ring_index, + active ? "active" : "halted"); + return active; +} + +static void bcm2838_genet_tdma(BCM2838GenetState *s, hwaddr offset, + uint64_t value) +{ + hwaddr ring_offset; + uint64_t num_descs_tx; + unsigned int ring_index; + uint32_t tx_intrs; + uint32_t cons_index; + uint32_t prod_index =3D value; + uint32_t ring_cfg =3D value; + uint32_t dma_ctrl =3D value; + + uint32_t cons_index_fld; + uint32_t prod_index_fld =3D + FIELD_EX32(prod_index, GENET_DMA_PROD_INDEX, INDEX); + + uint32_t exst_tdma_en =3D + FIELD_EX32(s->regs.tdma.ctrl, GENET_DMA_CTRL, EN); + uint32_t exst_ring_en =3D + FIELD_EX32(s->regs.tdma.ring_cfg, GENET_DMA_RING_CFG, EN); + uint32_t incm_tdma_en =3D + FIELD_EX32(dma_ctrl, GENET_DMA_CTRL, EN); + uint32_t incm_ring_en =3D + FIELD_EX32(ring_cfg, GENET_DMA_RING_CFG, EN); + uint32_t incm_ring_buf_en =3D + FIELD_EX32(dma_ctrl, GENET_DMA_CTRL, RING_BUF_EN); + + switch (offset) { + case BCM2838_GENET_TDMA_RINGS + ... BCM2838_GENET_TDMA_RINGS + sizeof(s->regs.tdma.rings) - 1: + ring_index =3D (offset - BCM2838_GENET_TDMA_RINGS) + / sizeof(BCM2838GenetTdmaRing); + if (bcm2838_genet_tdma_ring_active(s, ring_index)) { + ring_offset =3D offset - BCM2838_GENET_TDMA_RINGS + - ring_index * sizeof(BCM2838GenetTdmaRing); + switch (ring_offset) { + case BCM2838_GENET_TRING_PROD_INDEX: + cons_index =3D s->regs.tdma.rings[ring_index].cons_index; + cons_index_fld =3D FIELD_EX32(cons_index, + GENET_DMA_CONS_INDEX, INDEX); + if (cons_index_fld !=3D prod_index_fld) { + trace_bcm2838_genet_tx_request(ring_index, + prod_index_fld, + cons_index_fld); + num_descs_tx =3D bcm2838_genet_tx(s, ring_index, prod_= index, + cons_index); + if (num_descs_tx > 0) { + s->regs.tdma.rings[ring_index].cons_index =3D + FIELD_DP32(s->regs.tdma.rings[ring_index].cons= _index, + GENET_DMA_CONS_INDEX, INDEX, + cons_index + num_descs_tx); + + if (ring_index =3D=3D BCM2838_GENET_DMA_RING_DEFAU= LT) { + s->regs.intrl0.stat =3D + FIELD_DP32(s->regs.intrl0.stat, GENET_INTR= L_0, + TXDMA_MBDONE, 1); + } else { + tx_intrs =3D FIELD_EX32(s->regs.intrl1.stat, + GENET_INTRL_1, TX_INTRS= ); + s->regs.intrl1.stat =3D + FIELD_DP32(s->regs.intrl1.stat, + GENET_INTRL_1, TX_INTRS, + tx_intrs | 1 << ring_index); + } + } + } + break; + default: + break; + } + } + break; + case BCM2838_GENET_TDMA_RING_CFG: + if (exst_ring_en !=3D incm_ring_en) { + trace_bcm2838_genet_tx_dma_ring(incm_ring_en); + } + break; + case BCM2838_GENET_TDMA_CTRL: + s->regs.tdma.status =3D (~dma_ctrl) & GENET_DMA_ENABLE_MASK; + if (exst_tdma_en !=3D incm_tdma_en) { + trace_bcm2838_genet_tx_dma(incm_tdma_en =3D=3D 1 + ? "enabled" + : "disabled"); + } + if (exst_ring_en !=3D incm_ring_buf_en) { + trace_bcm2838_genet_tx_dma_ring_buf(incm_ring_buf_en); + } + break; + default: + break; + } +} + static uint64_t bcm2838_genet_read(void *opaque, hwaddr offset, unsigned s= ize) { uint64_t value =3D ~0; @@ -489,7 +706,7 @@ static void bcm2838_genet_write(void *opaque, hwaddr of= fset, uint64_t value, break; case BCM2838_GENET_TDMA_REGS ... BCM2838_GENET_TDMA_REGS + sizeof(BCM2838GenetRegsTdma) - 1: - qemu_log_mask(LOG_UNIMP, "TDMA isn't implemented yet"); + bcm2838_genet_tdma(s, offset, value); break; default: break; diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index b34c4b3ce7..bad582fe0d 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -110,6 +110,21 @@ OBJECT_DECLARE_SIMPLE_TYPE(BCM2838GenetState, BCM2838_= GENET) #define BCM2838_GENET_PHY_EXP_SHD_BLOCKS_CNT 256 #define BCM2838_GENET_PHY_EXP_SHD_REGS_CNT 256 =20 +#define MAX_FRAME_SIZE 0xFFF +#define MAX_PACKET_SIZE 1518 +#define MAX_PAYLOAD_SIZE 1500 +#define TX_MIN_PKT_SIZE 60 + + +typedef struct BCM2838GenetXmitStatus { + uint32_t length_status; /* length and peripheral status */ + uint32_t ext_status; /* Extended status */ + uint32_t rx_csum; /* partial rx checksum */ + uint32_t unused1[9]; /* unused */ + uint32_t tx_csum_info; /* Tx checksum info. */ + uint32_t unused2[3]; /* unused */ +} BCM2838GenetXmitStatus; + typedef struct { uint32_t rev_ctrl; uint32_t port_ctrl; @@ -405,6 +420,8 @@ struct BCM2838GenetState { =20 qemu_irq irq_default; qemu_irq irq_prio; + + uint8_t tx_packet[MAX_FRAME_SIZE]; }; =20 #endif /* BCM2838_GENET_H */ --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459066; cv=none; d=zohomail.com; s=zohoarc; b=GDI/IlNlG/67wbend3FX+4pXnH2L3nSLhOLMUNg6I61d1MLcAz34RVyTsv8dH6MLPagTEYAgjkGlgSDIpHyqWET0av0EgjBqsCaVHkBpwMolMiuTRaYbUYxmQhJNGRYulSXjD3tQgfRIm3UffrNl52++6RiAgPAvIFDcBl/e8A0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459066; 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=ZyUf+0xuNwZkQq7ZvOXhRn8NhD+IJyYijY7su9Bu40s=; b=D6xkqpRY2b6OImK3tbVSmB+9hbu3k5xmlEZnQDEweT3AJp5FHDeEm/T7R2H1hRtLJXAxh0bL7LoQFfMBneE2gxh1lMGzMpPrFi6nXvo7uz+AuMI9WC28RTe5y1Qz5nesACFgdUuYIeJL17ByM+zyEz49vaizI0b7F4BlIXdh5Uc= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459066674364.7986689256926; Tue, 11 Aug 2026 07:37:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnaq-000104-Cp; Tue, 11 Aug 2026 10:36:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaV-0000Jw-8t for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:21 -0400 Received: from mail-qt1-x832.google.com ([2607:f8b0:4864:20::832]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaR-0001ux-CV for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:19 -0400 Received: by mail-qt1-x832.google.com with SMTP id d75a77b69052e-51c1372f84dso20181871cf.2 for ; Tue, 11 Aug 2026 07:36:14 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.12 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458974; x=1787063774; 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:content-type; bh=ZyUf+0xuNwZkQq7ZvOXhRn8NhD+IJyYijY7su9Bu40s=; b=lCM00WQtLri5bUURBYc+n4CjaIvVvVo71bfowVfTrP/EjpilzLRV3hW83pug3fSvzH yss21ok6ibx5dXgtQxSv+CA7G//TcIt/s20k5L1vL+4XkHkU/byw8UwcyxFy1/dzyhE5 7vJZUIxA3pkJHKUW76tqmdf8+f3BqIRPP+74OUre3aOVUhI5s1zS/5TEAk6KqsOOKJj3 AZmAZDnxURj00EBbTkaQ0JspMvQVBBSvLOHBxXNK1chOkiEclhS/3cUpy1wyDm7XOetG +tnyslLs65j3ojPBSy7j3kH4RZXBjji/KFSrhunmRaKTYNzFbVlKy04dtSMk2O+E4DtQ hQmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458974; x=1787063774; 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:content-type; bh=ZyUf+0xuNwZkQq7ZvOXhRn8NhD+IJyYijY7su9Bu40s=; b=ipb9fPdDSiBGywoWMElqaHNKUkE2ZfmKOVD28/gBlCb8MhAMBtfxbxwAh5Mjcx4T4X vcMyane6xiSUxGXLkrEL25Yr4RoXJY4SpUAZNLXE5YIRIJpGgko6iqI4dAuANMhrWb1t fFYkKv92tSeA4V2HovNvl48X3IkxpgbPl/Hhy4ZlxEfVKT+r6pTumx8ODH9LpKyyFTNj /De9wvZicH4sAGfD/phUzQu7ChlMgy51AstbOsdEtKXZK3MBm6WBGWceCEvaJ2AqTawx aZFFn5X7X2wu5yD6UHfI1VZKDCXhSGYnau8RaBRkXlC8OxrUVACi2Rj3DF4EaK8vUeKV sgoA== X-Gm-Message-State: AOJu0Ywxx+c8JwwtOvPaXn+H1n3HayiZEzt9UFK9JdjcIcMaY195uNWW 0TNCMUmjLIjTaj23MwMkpzK+kF/uAu3Yv0Okjzjxqe/yH01GAxEHbNEFk6fpnQ== X-Gm-Gg: AR+sD10MrIRFPDQetuRWbiBZy7jX8bJPNYJDFhbU1Y/kEn5qrDkynR+AR/RRSV0+Fz+ +HSRyYT3lqnwAZph/xAg6T87hxJ/f2bDMXDywwZKGBXtkpEUG+TOCmpmTGWbYDSHqmyPH6/d7dm HSBcLyF10PI+yJ6cLO7mbgjBjuGejYrnKVmORqIz/Nazw5HJUNufIPhTom/CSysBRpXCfsoE5IT 9mFC1Re/4bjnt11H2gD19eKzRoIVbDjL5SvbFCPp0FQJc6gya2A4ZM6jmlWxGP+J445retKKwvX 7TEqCvJzKNlyMWX99d5jIX/oaaTmnxAUluTaYR884ELgm7DaNw3+t4wjCuyZSa+RUBFSflECbIt x3N/kacene+4RRVyVQG3MC2WYEjK3HYa5K9r6usuCHp7WhVYsnWfR3iWVTwRsIQrGblss860/Qg VS7KJSLSW9sk7kNC/jIyA5J+iDxvvgV0OPoCPyJn8XjZ/G2qWfmHeAmqkamhWw5FWYsZRu1xxu6 IV3OzQfsd54+z3+JOQ= X-Received: by 2002:ac8:7d47:0:b0:51c:7d0:7ed7 with SMTP id d75a77b69052e-52d586603a0mr28585381cf.39.1786458973501; Tue, 11 Aug 2026 07:36:13 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 13/19] hw/net/bcm2838_genet: implement GENET RX path Date: Tue, 11 Aug 2026 10:35:50 -0400 Message-ID: <20260811143557.7862-14-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::832; envelope-from=marcelomanzo@gmail.com; helo=mail-qt1-x832.google.com X-Spam_score_int: -10 X-Spam_score: -1.1 X-Spam_bar: - X-Spam_report: (-1.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, FORGED_GMAIL_RCVD=1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: 1786459068617158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Implement the receive DMA ring handling: qemu_can_receive()/ receive() callbacks for the NIC's netdev peer, copying incoming frame data into descriptor buffers on the active RX ring, classifying broadcast/multicast, and raising the RXDMA_MBDONE interrupt as descriptors complete. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Carried forward and completed by Marcelo Manzo; see the later "Fix bogus RX checksum reporting" patch for a real bug found and fixed in this code during testing. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 274 ++++++++++++++++++++++++++++++++- include/hw/net/bcm2838_genet.h | 1 + 2 files changed, 274 insertions(+), 1 deletion(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 1b02876094..746e416e53 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -520,6 +520,25 @@ static bool bcm2838_genet_tdma_ring_active(BCM2838Gene= tState *s, return active; } =20 +static bool bcm2838_genet_rdma_ring_active(BCM2838GenetState *s, + unsigned int ring_index) +{ + uint32_t ring_mask =3D 1 << ring_index; + + bool dma_en =3D FIELD_EX32(s->regs.rdma.ctrl, GENET_DMA_CTRL, EN) !=3D= 0; + bool ring_en =3D (FIELD_EX32(s->regs.rdma.ring_cfg, GENET_DMA_RING_CFG= , EN) + & ring_mask) !=3D 0; + bool ring_buf_en =3D (FIELD_EX32(s->regs.rdma.ctrl, + GENET_DMA_CTRL, RING_BUF_EN) + & ring_mask) !=3D 0; + bool active =3D dma_en && ring_en && ring_buf_en; + + trace_bcm2838_genet_rx_dma_ring_active(ring_index, + active ? "active" : "halted"); + + return active; +} + static void bcm2838_genet_tdma(BCM2838GenetState *s, hwaddr offset, uint64_t value) { @@ -735,9 +754,260 @@ static const MemoryRegionOps bcm2838_genet_ops =3D { .valid =3D {.min_access_size =3D 4}, }; =20 +static int32_t bcm2838_genet_filter(BCM2838GenetState *s, const void *buf, + size_t size) +{ + qemu_log_mask(LOG_UNIMP, + "Packet filtration with HFB isn't implemented yet"); + return -1; +} + +static int32_t bcm2838_genet_filter2ring(BCM2838GenetState *s, + uint32_t filter_idx) +{ + qemu_log_mask(LOG_UNIMP, + "Packet filtration with HFB isn't implemented yet"); + return -1; +} + +static bool is_packet_broadcast(const uint8_t *buf, size_t size) +{ + static const uint8_t bcst_addr[] =3D {0xff, 0xff, 0xff, 0xff, 0xff, 0x= ff}; + + if (size < sizeof(bcst_addr)) { + return false; + } + + return !memcmp(buf, bcst_addr, sizeof(bcst_addr)); +} + +static bool is_packet_multicast(const uint8_t *buf, size_t size) +{ + return !!(buf[0] & 0x01); +} + +static ssize_t bcm2838_genet_rdma(BCM2838GenetState *s, uint32_t ring_idx, + const void *buf, size_t size) +{ + const size_t DESC_WORD_SIZE =3D + sizeof(BCM2838GenetRdmaDesc) / sizeof(uint32_t); + + ssize_t len =3D 0; + BCM2838GenetRegsRdma *rdma =3D &s->regs.rdma; + BCM2838GenetRdmaRing *ring =3D &rdma->rings[ring_idx]; + hwaddr write_index =3D + (ring->write_ptr + ((hwaddr)ring->write_ptr_hi << 32)) / DESC_WORD= _SIZE; + BCM2838GenetRdmaDesc *desc =3D &rdma->descs[write_index]; + + const hwaddr START_INDEX =3D + (ring->start_addr + ((hwaddr)ring->start_addr_hi << 32)) + / DESC_WORD_SIZE; + const hwaddr END_INDEX =3D + (ring->end_addr + ((hwaddr)ring->end_addr_hi << 32)) / DESC_WORD_S= IZE; + + if (!bcm2838_genet_rdma_ring_active(s, ring_idx)) { + return -1; + } + + desc->length_status =3D FIELD_DP32(desc->length_status, + GENET_RDMA_LENGTH_STATUS, SOP, 1); + + while (len < size) { + size_t l =3D size - len; + size_t buf_size =3D ring->ring_buf_size & 0xffff; + uint8_t *dma_buf =3D s->rx_packet; + hwaddr dma_buf_addr =3D + desc->address_lo + ((hwaddr)desc->address_hi << 32); + MemTxResult mem_tx_result =3D MEMTX_OK; + uint8_t *frame_buf =3D dma_buf + sizeof(BCM2838GenetXmitStatus) + = 2; + BCM2838GenetXmitStatus *xmit_status =3D (BCM2838GenetXmitStatus *)= dma_buf; + struct iovec iov; + bool isip4, isip6; + size_t l3hdr_off, l4hdr_off, l5hdr_off; + eth_ip6_hdr_info ip6hdr_info; + eth_ip4_hdr_info ip4hdr_info; + eth_l4_hdr_info l4hdr_info; + + bool crc_fwd =3D FIELD_EX32(s->regs.umac.cmd, GENET_UMAC_CMD, CRC_= FWD); + size_t buflength; + uint32_t prod_index; + + if (l > ring->ring_buf_size) { + l =3D ring->ring_buf_size; + } + + memcpy(frame_buf, buf + len, l); + iov.iov_base =3D frame_buf; + iov.iov_len =3D l; + eth_get_protocols(&iov, 1, 0, + &isip4, &isip6, + &l3hdr_off, &l4hdr_off, &l5hdr_off, + &ip6hdr_info, &ip4hdr_info, &l4hdr_info); + + len +=3D l; + + desc->length_status =3D FIELD_DP32(desc->length_status, + GENET_RDMA_LENGTH_STATUS, + EOP, !!(len >=3D size)); + + buflength =3D l + sizeof(BCM2838GenetXmitStatus) + 2; + if (crc_fwd) { + buflength +=3D 4; + } + + desc->length_status =3D FIELD_DP32(desc->length_status, + GENET_RDMA_LENGTH_STATUS, + BUFLENGTH, buflength); + + desc->length_status =3D FIELD_DP32(desc->length_status, + GENET_RDMA_LENGTH_STATUS, + BROADCAST, + !!is_packet_broadcast(frame_buf, = l)); + desc->length_status =3D FIELD_DP32(desc->length_status, + GENET_RDMA_LENGTH_STATUS, + MULTICAST, + !!is_packet_multicast(frame_buf, = l)); + + xmit_status->rx_csum =3D 0; + if (isip4) { + xmit_status->rx_csum =3D ip4hdr_info.ip4_hdr.ip_sum; + } + xmit_status->length_status =3D desc->length_status; + + mem_tx_result =3D address_space_write(&s->dma_as, dma_buf_addr, + MEMTXATTRS_UNSPECIFIED, + dma_buf, buf_size); + if (mem_tx_result !=3D MEMTX_OK) { + desc->length_status =3D FIELD_DP32(desc->length_status, + GENET_RDMA_LENGTH_STATUS, + RXERR, 1); + } + + if (FIELD_EX32(desc->length_status, + GENET_RDMA_LENGTH_STATUS, RXERR) !=3D 0) { + break; + } + + prod_index =3D FIELD_EX32(ring->prod_index, GENET_DMA_PROD_INDEX, = INDEX); + ring->prod_index =3D FIELD_DP32(ring->prod_index, + GENET_DMA_PROD_INDEX, + INDEX, ++prod_index); + if (++write_index > END_INDEX) { + write_index =3D START_INDEX; + } + desc =3D &rdma->descs[write_index]; + ring->write_ptr =3D write_index * DESC_WORD_SIZE; + ring->write_ptr_hi =3D ((hwaddr)write_index * DESC_WORD_SIZE) >> 3= 2; + } + + if (ring_idx =3D=3D BCM2838_GENET_DMA_RING_DEFAULT) { + s->regs.intrl0.stat =3D FIELD_DP32(s->regs.intrl0.stat, + GENET_INTRL_0, RXDMA_MBDONE, 1); + } else { + uint32_t rx_intrs =3D + FIELD_EX32(s->regs.intrl1.stat, GENET_INTRL_1, RX_INTRS); + rx_intrs |=3D 1 << ring_idx; + + s->regs.intrl1.stat =3D FIELD_DP32(s->regs.intrl1.stat, + GENET_INTRL_1, RX_INTRS, rx_intrs= ); + } + + return len; +} + +static ssize_t bcm2838_genet_receive(NetClientState *nc, const uint8_t *bu= f, + size_t size) +{ + BCM2838GenetState *s =3D (BCM2838GenetState *)qemu_get_nic_opaque(nc); + ssize_t bytes_received =3D -1; + int32_t filter_index =3D -1; + int32_t ring_index =3D -1; + + if (FIELD_EX32(s->regs.rdma.ctrl, GENET_DMA_CTRL, EN) !=3D 0) { + filter_index =3D bcm2838_genet_filter(s, buf, size); + + if (filter_index >=3D 0) { + ring_index =3D bcm2838_genet_filter2ring(s, filter_index); + } else { + ring_index =3D BCM2838_GENET_DMA_RING_CNT - 1; + if (!bcm2838_genet_rdma_ring_active(s, ring_index)) { + for (ring_index =3D 0; + ring_index < BCM2838_GENET_DMA_RING_CNT - 1; + ring_index++) { + if (bcm2838_genet_rdma_ring_active(s, ring_index)) { + break; + } + } + } + } + + if (size <=3D MAX_PACKET_SIZE) { + bytes_received =3D bcm2838_genet_rdma(s, ring_index, buf, size= ); + } + } + + bcm2838_genet_set_irq_default(s); + bcm2838_genet_set_irq_prio(s); + + return bytes_received; +} + +static void bcm2838_genet_phy_update_link(BCM2838GenetState *s) +{ + bool qemu_link_down =3D qemu_get_queue(s->nic)->link_down !=3D 0; + + bool lstatus =3D FIELD_EX32(s->phy_regs.bmsr, GENET_PHY_BMSR, LSTATUS)= !=3D 0; + + if (qemu_link_down && lstatus) { + trace_bcm2838_genet_phy_update_link("down"); + + s->phy_regs.bmsr =3D FIELD_DP32(s->phy_regs.bmsr, + GENET_PHY_BMSR, ANEGCOMPLETE, 0); + s->phy_regs.bmsr =3D FIELD_DP32(s->phy_regs.bmsr, + GENET_PHY_BMSR, LSTATUS, 0); + s->regs.intrl0.stat =3D FIELD_DP32(s->regs.intrl0.stat, + GENET_INTRL_0, LINK_DOWN, 1); + } else if (!qemu_link_down && !lstatus) { + trace_bcm2838_genet_phy_update_link("up"); + + /* + * Complete auto-negotiation (fixed link partner's abilities for n= ow: + * 1Gbps with flow control) + */ + s->phy_regs.stat1000 =3D FIELD_DP32(s->phy_regs.stat1000, + GENET_PHY_STAT_1000, HALF, 1); + s->phy_regs.stat1000 =3D FIELD_DP32(s->phy_regs.stat1000, + GENET_PHY_STAT_1000, FULL, 1); + + s->phy_regs.lpa =3D FIELD_DP32(s->phy_regs.lpa, + GENET_PHY_LPA, PAUSE_CAP, 1); + s->phy_regs.lpa =3D FIELD_DP32(s->phy_regs.lpa, + GENET_PHY_LPA, PAUSE_ASYM, 1); + s->phy_regs.lpa =3D FIELD_DP32(s->phy_regs.lpa, GENET_PHY_LPA, LPA= CK, 1); + + s->phy_regs.bmsr =3D FIELD_DP32(s->phy_regs.bmsr, + GENET_PHY_BMSR, ANEGCOMPLETE, 1); + s->phy_regs.bmsr =3D FIELD_DP32(s->phy_regs.bmsr, + GENET_PHY_BMSR, LSTATUS, 1); + + s->regs.intrl0.stat =3D FIELD_DP32(s->regs.intrl0.stat, + GENET_INTRL_0, LINK_UP, 1); + } + + bcm2838_genet_set_irq_default(s); +} +static void bcm2838_genet_set_link(NetClientState *nc) +{ + BCM2838GenetState *s =3D qemu_get_nic_opaque(nc); + + bcm2838_genet_phy_update_link(s); +} + static NetClientInfo bcm2838_genet_client_info =3D { .type =3D NET_CLIENT_DRIVER_NIC, - .size =3D sizeof(NICState) + .size =3D sizeof(NICState), + .receive =3D bcm2838_genet_receive, + .link_status_changed =3D bcm2838_genet_set_link, }; =20 static void bcm2838_genet_realize(DeviceState *dev, Error **errp) @@ -791,6 +1061,8 @@ static void bcm2838_genet_phy_reset(BCM2838GenetState = *s) s->phy_aux_ctl_shd_regs.misc =3D 0x1E; =20 trace_bcm2838_genet_phy_reset("done"); + + bcm2838_genet_phy_update_link(s); } =20 static void bcm2838_genet_reset(Object *obj, ResetType type) diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index bad582fe0d..960042f6f4 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -422,6 +422,7 @@ struct BCM2838GenetState { qemu_irq irq_prio; =20 uint8_t tx_packet[MAX_FRAME_SIZE]; + uint8_t rx_packet[MAX_FRAME_SIZE]; }; =20 #endif /* BCM2838_GENET_H */ --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459064; cv=none; d=zohomail.com; s=zohoarc; b=hjpSi+6apmFm4FB6d6shMdzxD6b7Ijfz/agE/xZo/dSAQ4m5rL4KzGFhZ6MUzItC8vPDHcKGJyWpaxVFJE5UUmJ/rVQ4ZM7vyhgdvIq5pw1osHGE1KpUlfqzdKuSw2998m+yTCcRMnenXH1/RcRqQvU/Dmr9Nb7vQeAFvukZBvM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459064; 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=ZqAgbrrx/Se7VyDdoTAUZkumPcNidkyq5uRNc6l2ZDI=; b=IUS9tBB6tGuayuiHJhbR67UXiSbMPsxJ4+4bCQa9CZ0grvg5aiaS2mRwKyYFy6N0zThkDr8lsEGmDmGb/uv72rjUPeZe2oD8vs8OQc3EUJsIsAElH9pLItgA/zue675uQjECnwuOuo4Y4yJBN4ejR9yOTYvCwYWGDKfswivbo+U= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459064661289.1687763860534; Tue, 11 Aug 2026 07:37:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnaq-00010j-HM; Tue, 11 Aug 2026 10:36:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaT-0000Jr-EV for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:21 -0400 Received: from mail-qv1-xf2d.google.com ([2607:f8b0:4864:20::f2d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaR-0001vM-CQ for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:17 -0400 Received: by mail-qv1-xf2d.google.com with SMTP id 6a1803df08f44-8ef7b7651ecso8505326d6.1 for ; Tue, 11 Aug 2026 07:36:15 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.13 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458974; x=1787063774; 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:content-type; bh=ZqAgbrrx/Se7VyDdoTAUZkumPcNidkyq5uRNc6l2ZDI=; b=CGIPTVaA25VFeCTiXzlA23CaKjoDbn4cLt+ILW7NnTHEHFzuR22M989t2LgI9LvIwb 9AqrFeHm10z3KP4fc51HTpy4aAvFRefojYB/Zsf4fpNWUJ/OYU0i5o0tQMTDTxrEVj39 k7XU2Kpq6Yvl/72sdVJm8IB28xfmeNErwvrTlN/TekM+Cp8Zs/QffyBJGch1HUrenTK/ FQV4/R3C3Iw70UUp3Qqup+/E4myoNooJmHHpHopx40okKkXnbn33OCJ8JihE+P7wWdCu b7amoDlpBUVVx7yq0CW53ufMEUawQZJq52X3d8Mu0ISB08V/zaR88JeE5BdYMGrix4I0 vW+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458974; x=1787063774; 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:content-type; bh=ZqAgbrrx/Se7VyDdoTAUZkumPcNidkyq5uRNc6l2ZDI=; b=pvC5LxYpRve3yH6NIdQDvXhqEYYBkEDmmPdHPXaqPsAY1vWGPDtW20Wu7AS3BFtSaW eCVq9N6PycxnrVuzMWvbAtVpWG2J08R1du4wkORaf5vSKbVO+ujmcORu3RoJpbLc0Uua yHWYKkvD5jYcTZcjcCCf4/o8P3Q9hWw/xQttfzT+hbqxs6iIv6jvTzrnmup+r0YqY/Ef tgNFDy5ucpRHnOJEoclC6mBHIqY8ROlktVR++AML0IOl4l0RmusNw94FBY4ABkey0HCz 23tEtKIHIRM37oXo0Ir524a4BR8FWe0FFj7NUhwGhVxPJo/UPX2FULRIvMh9BvD5Ngs+ 0mQg== X-Gm-Message-State: AOJu0YwTov0+c/IB2cGlDluIzRN9XzY4DDqAQHuOwbyGnUXE/Xw4hnKx DaWbyGHivT6a6N5dHFO/qTCPRdLiZ2A3aHZ3Pbeo0sgeMADPBoUJOSRBB9qg/A== X-Gm-Gg: AR+sD11NeTpTS4mvk0dPqoiK5A83w2Uh5iKKe0wpZMnbzvOJvLcqGIVAbpySpjWuwXp yTwr2yVmB9GjjIchUzHHVR/PC7ML+GAYus2ZaWnmklP8hpNev78UPcj6KF6x74gd/j4W7TSjOZn 4khL6UxRZtguBF9BNzXrs8eNb45y4t8zHl7gglWZHGDjnlYMfcyYh6fpJ2qtH6XtlNaD2c0mkpB 4Ao2hO2kTTscptJT4j4ajGh9Hg1bL4nXLsORCXs6fQRQiXXkhWj7C9pGQ41ZhHJY44SJ3fhaya3 b0a8J5kIGsvO77VGgYmhUPRCczmnLLuED5+CBsMgRNKUOE8eOsZr4jNX46EY3sYezcMZ7JST8ES fV9UPfQsTunQppWHk63nOdIXZGOWjX7KPaBRkX3bIH2L+JT3kCGKMtp+upPxnu5LCzkWlLgaVgi 1joDHFv3KGnrKFBlN4VWYm5xybjGl/qCkC8/tHN5U50GH4ItcQJ3Y5zXz367EYaN7oLvl3d0/Ez Qlm7mwa2qRx1qJdqDg= X-Received: by 2002:a05:6214:1306:b0:8ee:d9b8:8538 with SMTP id 6a1803df08f44-90a6c0f994fmr4174626d6.9.1786458974473; Tue, 11 Aug 2026 07:36:14 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 14/19] hw/arm/bcm2838: enable BCM2838 GENET controller Date: Tue, 11 Aug 2026 10:35:51 -0400 Message-ID: <20260811143557.7862-15-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f2d; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf2d.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=ham 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: 1786459065438158500 Content-Type: text/plain; charset="utf-8" Wire the BCM2838 GENET device (added in the previous patches) into the SoC: instantiate it in the peripherals block with qemu_configure_nic_device() so it picks up a -nic/-netdev from the command line, map its register region at the real BCM2711 physical offset, and route its two interrupt lines through the GIC. Also stop raspi4b from masking out the "brcm,bcm2711-genet-v5" device-tree node, now that the controller it describes is actually implemented. Adapted from patches 19-29/41 of Sergey Kambalin's Raspberry Pi 4B series (patchwork series 829638) against current QEMU master. Signed-off-by: Marcelo Manzo --- hw/arm/bcm2838.c | 6 ++++++ hw/arm/bcm2838_peripherals.c | 11 +++++++++++ hw/arm/raspi4b.c | 1 - include/hw/arm/bcm2838_peripherals.h | 2 ++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/hw/arm/bcm2838.c b/hw/arm/bcm2838.c index fc56f87934..f47b96c3bf 100644 --- a/hw/arm/bcm2838.c +++ b/hw/arm/bcm2838.c @@ -239,6 +239,12 @@ static void bcm2838_realize(DeviceState *dev, Error **= errp) int_n); } =20 + /* Connect Gigabit Ethernet controller to the interrupt controller */ + sysbus_connect_irq(SYS_BUS_DEVICE(&ps->genet), 0, + qdev_get_gpio_in(gicdev, GIC_SPI_INTERRUPT_GENET_A)= ); + sysbus_connect_irq(SYS_BUS_DEVICE(&ps->genet), 1, + qdev_get_gpio_in(gicdev, GIC_SPI_INTERRUPT_GENET_B)= ); + /* Pass through inbound GPIO lines to the GIC */ qdev_init_gpio_in(dev, bcm2838_gic_set_irq, GIC_NUM_IRQS); =20 diff --git a/hw/arm/bcm2838_peripherals.c b/hw/arm/bcm2838_peripherals.c index d923ba968a..012a4567e7 100644 --- a/hw/arm/bcm2838_peripherals.c +++ b/hw/arm/bcm2838_peripherals.c @@ -44,6 +44,10 @@ static void bcm2838_peripherals_init(Object *obj) object_initialize_child(obj, "pcie-host", &s->pcie_host, TYPE_BCM2838_PCIE_HOST); =20 + /* Gigabit Ethernet */ + object_initialize_child(obj, "genet", &s->genet, TYPE_BCM2838_GENET); + qemu_configure_nic_device(DEVICE(&s->genet), true, NULL); + /* GPIO */ object_initialize_child(obj, "gpio", &s->gpio, TYPE_BCM2838_GPIO); =20 @@ -217,6 +221,13 @@ static void bcm2838_peripherals_realize(DeviceState *d= ev, Error **errp) memory_region_add_subregion(get_system_memory(), PCIE_MMIO_ARM_OFFSET, &s->pcie_mmio_alias); =20 + /* Gigabit Ethernet */ + if (!sysbus_realize(SYS_BUS_DEVICE(&s->genet), errp)) { + return; + } + regs_mr =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->genet), 0); + memory_region_add_subregion(&s->peri_low_mr, GENET_OFFSET, regs_mr); + /* GPIO */ if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) { return; diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c index 038eefb234..79f60932f7 100644 --- a/hw/arm/raspi4b.c +++ b/hw/arm/raspi4b.c @@ -66,7 +66,6 @@ static void raspi4_modify_dtb(const struct arm_boot_info = *info, void *fdt) const char *nodes_to_remove[] =3D { "brcm,bcm2711-rng200", "brcm,bcm2711-thermal", - "brcm,bcm2711-genet-v5", }; =20 for (int i =3D 0; i < ARRAY_SIZE(nodes_to_remove); i++) { diff --git a/include/hw/arm/bcm2838_peripherals.h b/include/hw/arm/bcm2838_= peripherals.h index 2a4307bed7..deddab50d2 100644 --- a/include/hw/arm/bcm2838_peripherals.h +++ b/include/hw/arm/bcm2838_peripherals.h @@ -11,6 +11,7 @@ =20 #include "hw/arm/bcm2835_peripherals.h" #include "hw/arm/bcm2838_pcie.h" +#include "hw/net/bcm2838_genet.h" #include "hw/sd/sdhci.h" #include "hw/gpio/bcm2838_gpio.h" =20 @@ -70,6 +71,7 @@ struct BCM2838PeripheralState { SDHCIState emmc2; MemoryRegion pcie_mmio_alias; BCM2838PcieHostState pcie_host; + BCM2838GenetState genet; BCM2838GpioState gpio; =20 OrIRQState mmc_irq_orgate; --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459143; cv=none; d=zohomail.com; s=zohoarc; b=ZRcGoqEWY8wUfYp75JjNEQ/cmgc+CtgT2nSutuN65F+UvFboj8/Adc5fONmfEGqr2JFssgNP4coL0Zs18UhaM/oPIIWPdKW1lva24bMOcmx9kkugbXI9YR2HoBNdENrjz7Cafch00eWHBZ/g95JXXnW80FOX+hJuL4Z8qHGXy90= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459143; 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=qLQTI3zH2lnSRnuugMAOGuO5ULK1Vo14gVKj4dalpTw=; b=AYcsfFOXYm3Bet8rJEDz3uV/xDO8u5SzhrsojpEBOU5pJlVuhWdqmRw5+DgRWn8FLE196dj3w0OxuqBYpj9b7wfyxPtm1CmSUwvdmRdUC5iz5Pp7lsaKT8YYcyxCu4manllcK1Y1kXefuqdoFsYlMXPVHEaHAjilSNulhRPOnHU= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459143275317.7393075556163; Tue, 11 Aug 2026 07:39:03 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnat-000172-Js; Tue, 11 Aug 2026 10:36:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaU-0000Ju-Pv for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:21 -0400 Received: from mail-qv1-xf34.google.com ([2607:f8b0:4864:20::f34]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaS-0001va-Bf for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:18 -0400 Received: by mail-qv1-xf34.google.com with SMTP id 6a1803df08f44-90a6b298887so1159506d6.2 for ; Tue, 11 Aug 2026 07:36:16 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.14 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458975; x=1787063775; 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:content-type; bh=qLQTI3zH2lnSRnuugMAOGuO5ULK1Vo14gVKj4dalpTw=; b=mIuv+cuewt9UzZJHUArPxbhGl5C8bO1ZMVBmzabgWhxpBlrIt+kxloK0/BqnHZshNI bq/6NRP0NihGZRpFOmHf2KDa1CoI7BuUTR50UUX/m+WeZGXV6MkjhhYUYR9xESMv+jO3 /F+/aSgJdlhnbPmHSpGr6HFzoun9e9FjwZzPtNLCSnbPpE09XCtLWkiPSA56Idmp5gPX yGVq08GuLN9r4uVYmGcTnyvdRnjg8okDe4WxyQPzr9kY2+GPjnmWP1GZbVV5nKp8U594 h8eHujfIy+790IOjDS6kJBmL7dUdaeTY0P+qbjEJhuUCUlPJd7pFm1wacNwbqgJsLgbI 5NYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458975; x=1787063775; 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:content-type; bh=qLQTI3zH2lnSRnuugMAOGuO5ULK1Vo14gVKj4dalpTw=; b=SjydVq0R1PrOXfoYxEFpYZ3g2Am9itoV5trE1Kn6TVpug+eBr2ZZxGphZUJLZvfWfM BoTodZ28yfEz8xOWzNg/uSKvzLelrcZIKU1zrgMbgjt+0d4sgvYzgY0fQIInhYtWbbLF SLWWlbGBGWXdSBQm8Ys7CGHYmDwpCZjmkA5ee4tqaDm+NGKIREb/ldExaWLawMI678kH fUgkX5tKWuCBk13KXhVx4oZIbA7uwnL/E2B+nWH+ZV3kZbAMyxTv8SGIruubfZxBJqq9 Rbl7+tGM8el3su0rCfPqbIl2SXqmY1IrVLrx0FNUSo5ipmJmrSWvC1TNIAAa9/OXbz/V PlTA== X-Gm-Message-State: AOJu0YxHV8LcD+LCDA1P04Lc4w2U0ZEG9se8m4G+hrasbb1NGep2zb6x QPn/rskAVBv2ccFDlS7LbIeV8ydF8bwshW5jEu7ULwasO9wCwL32RP+HEVgbIA== X-Gm-Gg: AR+sD13Gb68IFqpicTCVlYhrjRDGi2RT9iPVjkOuQCAefj7SziEO6xcCuZW1XQVDbo5 ZuHdvUwBauMeINykLLGnJBsiyU7jAbZv6PWr08u91w2Z7PGhIdhXMXR5ZNey/PvGKc5NWOpXYDK 4NRE+/LxmtUnKMcEeWce2X+hNwbe8+/CW0wMPx/iY950MTaN2XD23V8SuR0lXOCcgKVvAeYxvoB XBB2nFBA0zyTYG3wlt4ku64S8WxuzJfR4vIld/bGbLUsZT7Cuodgf0Spo5pbgaxHNogynwlK0Th B06k8U/EZAoVdJnBEZaj24Xmdeoutr0MASFM7Ixlwjyny38cA2YTY9j1Op1AKlPXQrHRIwWa5cP enQQGsYZaKUoi26TIXCJeEHXSvFf/seoIC41EzJFjOVDrtZXzF8eHowNfFzQPgHPzl3nO7NMZ0V lIb4AQPpOkVTur3/e3M5MdvywOh/EoU1PIyN/gaRVUVv7LkC/WARSuyty+Ers/1NivS+x49qMZT j7mbmvv9Qfy6Hj0SRbXu86mIEYmNw== X-Received: by 2002:a05:6214:2b8e:b0:907:c31d:dfad with SMTP id 6a1803df08f44-90a66e01a7dmr31392396d6.9.1786458975340; Tue, 11 Aug 2026 07:36:15 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 15/19] hw/net/bcm2838_genet: fix PHY autonegotiation-restart deadlock Date: Tue, 11 Aug 2026 10:35:52 -0400 Message-ID: <20260811143557.7862-16-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f34; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf34.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: 1786459143946158501 Content-Type: text/plain; charset="utf-8" The guest PHY driver requests an autonegotiation restart by setting BMCR.ANRESTART, then polls BMCR waiting for the hardware to clear that bit as an acknowledgment. bcm2838_genet_mdio_cmd() called FIELD_DP16() to clear ANRESTART in phy_reg_data but discarded its return value -- FIELD_DP16() does not modify its argument in place, it returns a new value -- so the bit was never actually cleared in the register the guest reads back. The guest driver then spun forever waiting for an acknowledgment that would never come, appearing to hang the whole boot. Assign the FIELD_DP16() result back to phy_reg_data, and also call bcm2838_genet_phy_update_link() once the restart is handled so link status actually gets refreshed, matching the surrounding code's own comment ("Initiate auto-negotiation once it has been restarted"). Found by booting a real guest against this series and tracing the MDIO command register with targeted debug prints: the guest was observed polling BMCR indefinitely, always reading back the ANRESTART bit still set. Confirmed fixed across repeated boots: link comes up and autonegotiation completes every time. Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 746e416e53..dfdc5ac728 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -20,6 +20,8 @@ #include "hw/net/bcm2838_genet.h" #include "trace.h" =20 +static void bcm2838_genet_phy_update_link(BCM2838GenetState *s); + /* GENET layouts */ REG32(GENET_SYS_REV_CTRL, 0) FIELD(GENET_SYS_REV_CTRL, GPHY_REV, 0, 16) @@ -392,10 +394,15 @@ static uint64_t bcm2838_genet_mdio_cmd(BCM2838GenetSt= ate *s, uint64_t cmd) if (phy_reg_id =3D=3D BCM2838_GENET_PHY_BMCR) { /* Initiate auto-negotiation once it has been restarte= d */ if (anrestart =3D=3D 1) { - FIELD_DP16(phy_reg_data, GENET_PHY_BMCR, ANRESTART= , 0); + phy_reg_data =3D FIELD_DP16(phy_reg_data, + GENET_PHY_BMCR, + ANRESTART, 0); } } *phy_reg =3D phy_reg_data; + if (phy_reg_id =3D=3D BCM2838_GENET_PHY_BMCR && anrestart = =3D=3D 1) { + bcm2838_genet_phy_update_link(s); + } } } } --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459207; cv=none; d=zohomail.com; s=zohoarc; b=Y3Us6OOBbD5lZYrTA//I14VBGuoJsG/Bjgbe35/7reuq4fk8WxwHJRgHqJ9m5Symy5FW1z5+z/Fn/XuqpvWdTnj05I8sbo+lxQFZRkeBMY7sgEOznutgKdNqv1aXCvd8Zg1z7OcGNuROrr11Vn9TBs1vsiv0npn7AaBU1efWAsg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459207; 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=0jXwXMcIM9domi9Vq64aJDlJVcT9DGz1pqG5naol8gc=; b=jkISPFTEGbSDQtCfN+syFB2bwJ6KhUv+QIETzbU4i1Zrmz2nbJ1iSSvZouZB0DV467FN5SlSBrhXE9ogGybdS4YH8HFn1cZH2hQMn4Dd3eVmxsAJ6KmAlo77pX5cnqr7CniiBqE4Z/rQ42J3TymNXsCtQLkoKx/Qv0eBirJ8f/w= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459207470449.1277431467697; Tue, 11 Aug 2026 07:40:07 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnar-00012c-2A; Tue, 11 Aug 2026 10:36:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaV-0000K0-VR for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:21 -0400 Received: from mail-qv1-xf2e.google.com ([2607:f8b0:4864:20::f2e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaT-0001vs-Mv for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:19 -0400 Received: by mail-qv1-xf2e.google.com with SMTP id 6a1803df08f44-8f032b47e3cso22080666d6.0 for ; Tue, 11 Aug 2026 07:36:17 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.15 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458977; x=1787063777; 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:content-type; bh=0jXwXMcIM9domi9Vq64aJDlJVcT9DGz1pqG5naol8gc=; b=RjoN6LqXA7Y0ZrXVmLrygATIQFWcCaY/KLJtyZyZID1Lw1+jxKPs58BBZdtOIBXiFR X2EL4AJ9OS/ZdRxg8f+sh88wsEsk+dQ0fqh6cneMxSGTf6EAYILox6dDV5wUJoWl8X86 /Bx3Ugp9WbWDGOmeQOg93o7RtcfnfeJAZfBtntztEaHNdWwGrnB7RZiEMCNCQ+ehEBQy MLF3mBYxKJZ4O7D/0fIB0gkQCdrzADTQz8i4zTFxq/btfxOtFMNFLTp5pFtI4Z3GZ08R K5DfPKDYqK9rmrDjM/5dc+L1AOE8wrSCcJTlaERD/Yer8scSp5moD4nSqEe1NiBU59W/ 0CWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458977; x=1787063777; 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:content-type; bh=0jXwXMcIM9domi9Vq64aJDlJVcT9DGz1pqG5naol8gc=; b=WZQx4y8dPq+gwDvKQ8SYqxgVXm4tQZM9D0WzNJcMxyZO9AYnJvD7/eSTrcc8DqFRh1 V1n43jMAd3qZ2qVdmIwjSwnpE1zb6FZ6EdOoZUHPOtfpsYGi6dJwMoO9eCKmiRclhr/M y3WevEOcfqOohuEdapYDQUHz0k0bK8AjldGVK1T16Rpss5gY3zaPe58Bb/QRn48IVvIL b+JdectXiT/GpZ9ccSMp6L/4DVkGU1nDjqJDXo1dqDZknecq5A6xjwCV86OYrtcEkC5n s0pX3tmXsn0JMigybMalZcsH1CSwIWbD2+/PboLT/LleKcHWUoBO6y4wdCbgwXBVp6yc KOEQ== X-Gm-Message-State: AOJu0YzDtAd1FeAr4ANYyh0q9ZhP9aXr4zbE2RzfVubk8fGG0t8iZbUe zaRF3suq9efOpKZAcJTvnihsm5CYpv9RvQWba6lsMYpynvK7L3T5IJbwGF4IXw== X-Gm-Gg: AR+sD10TYmlwwcL9/nefKueIPbPXN+QSOPqhX+SSWpWsvEiy/zUjBG7jp3D1DBg+KR5 VZG7krtMNoOdCh2NznTYlxm6AioVQo0U6pbPEuQFpqmGqA+144mhcQvflVVaPtPzSkm8aVBgzFV 7dZBLhIAe3zeaOc7u8NZ2TOZCjeEdJreGaz/L4MHxTcrdO5IWPTeSfdk8C74yIVZ/n6k6ur/DrW Jo0KrRKcp78p+6Z5PfYrrko3qh2U13KaeI3h0mp13TEt4Ge1xgXLOcZEBsbn1JkyzYewJ0YxJBg L7WhVgg/rdma5J9a2gZSN6hwnGTWJBFIUla5jLdd++MMpD+PsgxM+OEnDAddgfkExX1ivB09kP/ GzM4adlahFfvOBgWFJPBmLqlIsyDANEb5Hk38refoA4N1dLWcEGjRZZ2cVrxpk4b9xuNUJD+R96 OTVV27omxzhReqQTY5MX56oli+WWQHVRq32hfX76V3hbk/shzAiMr6NYuFr7zEH2YVdJ1xTIJaM hOwMirGBC1UuzCT8SM= X-Received: by 2002:a05:6214:404:b0:8ef:cfa:2a36 with SMTP id 6a1803df08f44-90a6681f28amr34221656d6.9.1786458976516; Tue, 11 Aug 2026 07:36:16 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 16/19] hw/net/bcm2838_genet: fix bogus RX checksum reporting Date: Tue, 11 Aug 2026 10:35:53 -0400 Message-ID: <20260811143557.7862-17-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f2e; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf2e.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: 1786459208423158500 Content-Type: text/plain; charset="utf-8" bcm2838_genet_rdma() reported the received frame's IPv4 header checksum (in host byte order) as the descriptor's rx_csum value. The guest driver's CHECKSUM_COMPLETE path expects a running checksum over the L4 payload there, not the L3 header checksum, so the mismatch made the guest reject otherwise-valid inbound packets ("hw csum failure" in dmesg, from bcmgenet_rx_poll()), breaking DHCP and general connectivity intermittently. Report no hardware-computed checksum instead (rx_csum =3D 0), which makes the guest fall back to verifying checksums in software; this succeeds since the packet data itself was never corrupted. Drop the eth_get_protocols() call and its output variables along with it, since isip4/ip4hdr_info were only ever used to compute the checksum value being removed here. Confirmed with the guest booted repeatedly: "hw csum failure" no longer appears in dmesg, and ping to the gateway succeeds with 0% loss. Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index dfdc5ac728..ccf3c2fef0 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -828,12 +828,6 @@ static ssize_t bcm2838_genet_rdma(BCM2838GenetState *s= , uint32_t ring_idx, MemTxResult mem_tx_result =3D MEMTX_OK; uint8_t *frame_buf =3D dma_buf + sizeof(BCM2838GenetXmitStatus) + = 2; BCM2838GenetXmitStatus *xmit_status =3D (BCM2838GenetXmitStatus *)= dma_buf; - struct iovec iov; - bool isip4, isip6; - size_t l3hdr_off, l4hdr_off, l5hdr_off; - eth_ip6_hdr_info ip6hdr_info; - eth_ip4_hdr_info ip4hdr_info; - eth_l4_hdr_info l4hdr_info; =20 bool crc_fwd =3D FIELD_EX32(s->regs.umac.cmd, GENET_UMAC_CMD, CRC_= FWD); size_t buflength; @@ -844,12 +838,6 @@ static ssize_t bcm2838_genet_rdma(BCM2838GenetState *s= , uint32_t ring_idx, } =20 memcpy(frame_buf, buf + len, l); - iov.iov_base =3D frame_buf; - iov.iov_len =3D l; - eth_get_protocols(&iov, 1, 0, - &isip4, &isip6, - &l3hdr_off, &l4hdr_off, &l5hdr_off, - &ip6hdr_info, &ip4hdr_info, &l4hdr_info); =20 len +=3D l; =20 @@ -875,10 +863,19 @@ static ssize_t bcm2838_genet_rdma(BCM2838GenetState *= s, uint32_t ring_idx, MULTICAST, !!is_packet_multicast(frame_buf, = l)); =20 + /* + * Report no hardware-computed checksum. The IP header's own + * checksum was previously (incorrectly) stored here, but the + * guest's CHECKSUM_COMPLETE path expects a running checksum over + * the L4 payload, not the L3 header checksum -- and it was stored + * in host byte order besides. That mismatch was causing the guest + * to reject otherwise-valid inbound packets ("hw csum failure" in + * dmesg, tied to bcmgenet_rx_poll), breaking DHCP/connectivity + * intermittently. Leaving this at 0 makes the guest fall back to + * verifying checksums itself in software, which succeeds since the + * packet data itself is intact. + */ xmit_status->rx_csum =3D 0; - if (isip4) { - xmit_status->rx_csum =3D ip4hdr_info.ip4_hdr.ip_sum; - } xmit_status->length_status =3D desc->length_status; =20 mem_tx_result =3D address_space_write(&s->dma_as, dma_buf_addr, --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459104; cv=none; d=zohomail.com; s=zohoarc; b=X7WOf420cjpc4l5nfn3+165qtaHnionaJZs0khvoSdr4T0cIRD8vM0iORiiZV/sG4YGh+l40uSGeyGhOqx+YN6E3kPUnQKyBEK2KKUgvw/VuVhpPFv8c0IcXtJlgejr7bZBbpk5FtzRWmcO4Z4SRvTDX2OTteF0Z+cc0eQZfGaQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459104; 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=D3MDMyFwx9BA61yhNaWY6HqytTiFGsQ7fXIYaLXoOcs=; b=canepAry0VouiQFM71NkEIhgz0Fh8LizYNFm4ugj9aqHkyq/jVkIgFblkZT827IpErJGJRDVsPRCWlYnfT2Ip5Q/t20XKrCPY1dR/S+PipWhKlcFP5jEsbH60ycJBpFQC98FZw1C+x1tvdOVxCnOuhlwVaQ23qCmfCiHY0BOSxE= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459104223371.50030177526764; Tue, 11 Aug 2026 07:38:24 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnar-00012h-2Q; Tue, 11 Aug 2026 10:36:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaW-0000LO-8E for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:21 -0400 Received: from mail-qv1-xf31.google.com ([2607:f8b0:4864:20::f31]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaU-0001wD-PD for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:19 -0400 Received: by mail-qv1-xf31.google.com with SMTP id 6a1803df08f44-8efb708b1a0so18945316d6.3 for ; Tue, 11 Aug 2026 07:36:18 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.16 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458978; x=1787063778; 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:content-type; bh=D3MDMyFwx9BA61yhNaWY6HqytTiFGsQ7fXIYaLXoOcs=; b=cjTn/Em1k7SdRoDArbLvPuqb2U9CoXqHnhORz5GKHCXo4NcQ5bILwAbrLKY7gIVdh2 tI11ps0AxESGm/1YlFra5Xn4GFAShSHwr71f0TGtIxw8sC3LIZO4RhN7954PNrlhsbF9 /j+5pAfoIP22Pi42wYTMDGI4yQ0kNBBkzCy/KZCmzmyVDOmjhcQhf/GZP1i/+h2uUIe7 avnMsLKiuy57Nm2aURRqz8fP8Jl5zyw8Y6ij1NipKTePIekcwlrTJYWD/9O3eBmkw7Fv Lf9l6mZO/L0bnlsiV21pg5bgNhV5kzs09CLP6F5xoat0FnF57BFhbFmTVtwuGHs2DwYe jVOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458978; x=1787063778; 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:content-type; bh=D3MDMyFwx9BA61yhNaWY6HqytTiFGsQ7fXIYaLXoOcs=; b=W2F45Fa6DhdeYTXGm4iMgzXlv+vgMSHO5BodkR5MRXYT5OBkqBTk3d5CoW95AEVJaq NANJ3s7CusJsPNWdDqhs9LauRMo6OxrK2TynUCOs/TLB0z2UumE+zaG10hWhRGJYE/4B 3MCmSn7ebD85VKzZMUH02jvSHTXUUQFKZ4RKpbkH+EkXITZTaJJbZh9fAYcwSpXrqxyp SxRGPt+hdcJrSIJY2hKFSmVatWFzLvrJvZkFNIrwKZBRzfUjjStsgfeOf+S7gPdYlVhp 8C44U1PZ7GHbnR2dW2BJQEQtTC0Gjr+fhH6D7ThdkcoBkrSeQmRe59zAUmVoPdN6HNym hMBg== X-Gm-Message-State: AOJu0YyS5pCwo7SVDMWIlr+1CC9+SStVf8W6l3U5oclpjy7OmRTztrTF yn5UeI/HKFIT2rsXnpl4LGXYcJM3skDKVsTgWv4lqJqhY5OvMyDiUNglmq0DXA== X-Gm-Gg: AR+sD10pGze43GQRzRALH/bIqMTLnq0AvyiHAWaasKZHl0JXdgfXOSFwvxeqIeUY4r0 TURHTYft4viXDLSgeBr9dIJxrIlky59mkxRiDD7PQYuvomITAKeTC3XUgQ2HtGgn71xtF+Eaq7p Gl8282YBjqPZTPxSMkhE1LcavU41Wlvpuqd1vWKLpgYNRe9dwfyeBx6QsjmNZliKDhPovIgN99C JHrZphGOq3XGltoSQX8U00VfaxMr9yd/L7KJFHy2imXJKLOz5D5EYUJNWKzH6Bmc9e5KdWpo+T7 Wqjv27l3mPrLUNf0xnaSYAPmvtlVfmggeH5AlB+pgvVeLCx8DyHERdcuidKFcAsqboOmyrhINog vfvrv2PU+BXddracn1T1QoHAWAJYumAKdTBuNsyiwJ5ki7B6wyZtRXN5onfDVfzLb2DlZmg8nlm cOZLjHBWJzK4bosB2tfaQxUsTwTkKTDak9nM7xYC4wM3RjS++47Wry3+Jr0VYpZyDvbuYhQkfrH /vUi/MUvg1hU4hZryU= X-Received: by 2002:a05:6214:3204:b0:8dc:ad48:70a7 with SMTP id 6a1803df08f44-90a6c27faa6mr3659446d6.26.1786458977557; Tue, 11 Aug 2026 07:36:17 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang Subject: [PATCH v2 17/19] hw/net/bcm2838_genet: fix TX ring activation check Date: Tue, 11 Aug 2026 10:35:54 -0400 Message-ID: <20260811143557.7862-18-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f31; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf31.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=ham 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: 1786459105816158500 Content-Type: text/plain; charset="utf-8" bcm2838_genet_tdma_ring_active() extracted the per-ring enable bit from ring_cfg_reg using the GENET_DMA_CTRL register's EN field definition (1 bit wide, at bit 0) instead of GENET_DMA_RING_CFG's own EN field (17 bits wide, one bit per ring). Since a 1-bit extraction at bit 0 only ever reflects ring 0's enable bit, every other ring (1-15, and the default ring 16) was silently treated as inactive regardless of whether the driver had actually enabled it. TX traffic hashed onto those queues was dropped with no error, eventually tripping the guest's qdisc watchdog ("NETDEV WATCHDOG: transmit queue N timed out") and causing intermittent DHCP failure / link-local address fallback. bcm2838_genet_rdma_ring_active(), the RX equivalent, already used the correct field, confirming this was a copy-paste error isolated to the TX path. Confirmed fixed across repeated boots: real DHCP lease every time, 0% ping loss, no more checksum or watchdog messages in dmesg. Signed-off-by: Marcelo Manzo --- hw/net/bcm2838_genet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index ccf3c2fef0..bb967ad845 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -517,7 +517,7 @@ static bool bcm2838_genet_tdma_ring_active(BCM2838Genet= State *s, uint32_t ring_mask =3D 1 << ring_index; bool dma_en =3D FIELD_EX32(ctrl_reg, GENET_DMA_CTRL, EN) !=3D 0; bool ring_en =3D - (FIELD_EX32(ring_cfg_reg, GENET_DMA_CTRL, EN) & ring_mask) !=3D 0; + (FIELD_EX32(ring_cfg_reg, GENET_DMA_RING_CFG, EN) & ring_mask) != =3D 0; bool ring_buf_en =3D (FIELD_EX32(ctrl_reg, GENET_DMA_CTRL, RING_BUF_EN) & ring_mask) != =3D 0; bool active =3D dma_en && ring_en && ring_buf_en; --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459060; cv=none; d=zohomail.com; s=zohoarc; b=LowS7tGVUoprMql4RTfadpT1mAzK7lkAk3t8k36stogQpKqrQR+k9PwgMnXuoQs1MWYTnFxOnjjO4BcZr+yzueU5g8gfi+8It3c01JAoe4ercLe96NPtd47f7Ak2I+Sdo0/Va7E8JWOk8fdlFiSSvbMnHutrOtwLynKxaLV/TEk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459060; 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=sNEEyf0DhnqBWvsZHpey8UBC3nPrPs683XYOT8uHTkU=; b=QidN2kTGC8mVsp/tKLTwjHPWWp9iJh8V6f8MyKSe2/v4mVgyhP8a/oE9HmZ7rGIqzLpWB14qo5tBj+KA8RyspYDdtHOA1DDqs6jIlr7zTO8moLurdD4axdpGKwZkFTmWO7Baev/uwcKEqE8y1efv5W9BSW6Kt43tl4T/hqb+4ls= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459060826894.0641600543232; Tue, 11 Aug 2026 07:37:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnas-00014l-41; Tue, 11 Aug 2026 10:36:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaX-0000N3-SV for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:23 -0400 Received: from mail-qv1-xf36.google.com ([2607:f8b0:4864:20::f36]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaV-0001wa-IE for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:20 -0400 Received: by mail-qv1-xf36.google.com with SMTP id 6a1803df08f44-8f1a8e914a9so26039096d6.1 for ; Tue, 11 Aug 2026 07:36:19 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.17 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458979; x=1787063779; 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:content-type; bh=sNEEyf0DhnqBWvsZHpey8UBC3nPrPs683XYOT8uHTkU=; b=QzXPoyaW3Sk2ZheorTZhOz2I0V9rWOCNWVcH5F/nloLKrFMIaPjxHJEwckmfK3bdmt 3RHXljWFqedZ2q8toL2TiQSGNLaOsGn1vX2KqVSUZIkOn+V7Zk8ePV/3i9oIgyqG36lw 0NOmfmhL98eekDoEZAzU6zz41x6u/sqUlyG8LB5aT30aieTAZbHlfCavvN0G3U6grc01 6lLhqcs0mSHiQL20s5Crs3nq4DGOOwOenU5bCIfoNGJeeZcbPQxEEp/ZXWFPDGWhThHl xi3xbdw55dTnASP9bW3R/IRSkLAzWKuheMO6qeyq1rYvYOCOvoh6lei6IPF9XHgt1DqY +N2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458979; x=1787063779; 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:content-type; bh=sNEEyf0DhnqBWvsZHpey8UBC3nPrPs683XYOT8uHTkU=; b=kNGORWp+q60FeLWJOrWVPRbtOn/4GpJsKE40rsZKU9P8x6TK066VU7KkjDbIdHH6I2 Ewc+x1Nvf1hPj0tQlR1dKR+8sM77kSNHf+0q54d9QNI1rhUlnrk8da4Yuc+w9WUoMsx8 Yn4CwzHA8Y7GIv2bhzZqWWNXDtyEZuXvcRf72yd8VFS8yKj8c9blOgVD/PKNkjrYxDkB 54Bp4s5AbLc7AeZO3orAMlJoXYAuPKv0KT3TLfa+IsRa+3jhZBeXo7OmLZXAxAYwHQYR tbv7XpDb/NONzzxtLFnud6EE7zUk0uQIKWJFx/pmLaatLzI/3PDl1DOs+qbraw80ckVp XIrg== X-Gm-Message-State: AOJu0Yyi7bjfhTNftvKDtEcdqmpjpguP4nNKsPbfwOKdiOHH9iDMAVAm OHjcRx+VwkEhl19WFpUXnw7mnSrYhKo6b5eMnRsp8QIC21nFYZpqjAHrrHD+2Q== X-Gm-Gg: AR+sD10Kc6NlD0wqbgREGSQJPats7kId+KeluvdehA60ZtKtSD/pbTzXSL9E33ypC/e WPzmSEdyYChtpSWxUJ3FgLHlm476XCMuVcqa5cIzgGzYRrHYAYiXSpIzOo5AX29pnVBSaYaAWLs FowFoOZyfEjXp4hD1JFzz+liWsiIWoD6mGsFHdvBGu9wJ0S7tLw7bWYwV7463clLWxRjvIfg22X FS3MRziw2XTQnAdvFmylZf4r3SOpgBtY8GtmSFg5gruQ3eiKRUnw+fAX2SbCJi3Bm+jahPKjnZe PpjTgIEQh6TbGGP9HCXDf2nbzXizGPhI7RrqlvbNNEaTNSNlY+PGCIogo+5obT8x1QLu08/qiJT lpVGfpA2VxtnxZDUpLuNmaZrsrOqmqr25V/ao4FX4rNBzy66ZxHtBtERactfksaL2Y+TPMlDyoB jq3a2R3FxtYNEjFD1nDk11R8RXkcoRXGJEQgykrluNdzMaHMRBbdsZpmDm+nnzYZV2D3tNZC3iT 8UvWuf43ZD2ee5JFeJV/lMQqP9f+DI= X-Received: by 2002:a05:6214:4306:b0:8ee:756a:f1cb with SMTP id 6a1803df08f44-90a6692620emr34950626d6.28.1786458978556; Tue, 11 Aug 2026 07:36:18 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Pierrick Bouvier Subject: [PATCH v2 18/19] docs/system/arm/raspi: move PCIe/GENET from missing to implemented Date: Tue, 11 Aug 2026 10:35:55 -0400 Message-ID: <20260811143557.7862-19-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f36; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf36.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=ham 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: 1786459061369158500 Content-Type: text/plain; charset="utf-8" raspi4b now has a working PCIe Root Complex and GENET Ethernet controller (added in the preceding patches); move them out of the "Missing devices" list and into "Implemented devices". Signed-off-by: Marcelo Manzo --- docs/system/arm/raspi.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/system/arm/raspi.rst b/docs/system/arm/raspi.rst index 44eec3f1c3..a8fc37e920 100644 --- a/docs/system/arm/raspi.rst +++ b/docs/system/arm/raspi.rst @@ -36,10 +36,12 @@ Implemented devices * VideoCore firmware (property) * Peripheral SPI controller (SPI) * Broadcom Serial Controller (I2C) + * PCIe Root Complex (raspi4b) + * GENET Ethernet Controller (raspi4b) =20 Missing devices --------------- =20 * Pulse Width Modulation (PWM) - * PCIE Root Port (raspi4b) - * GENET Ethernet Controller (raspi4b) + * PCIe MSI/MSI-X interrupt delivery (raspi4b) -- INTx works; a PCIe + device that only signals via MSI/MSI-X needs ``msi=3Doff,msix=3Doff`` --=20 2.47.1 From nobody Wed Aug 26 07:24:09 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=1786459192; cv=none; d=zohomail.com; s=zohoarc; b=MgwgnmNz33STAtct8AjkF4ec0idV8fWgKUvb09Ifs+8Lpguq4TsCK9aHQrvrWXmA7AboQ294MuIuNc8oLF1JyWF3fV2/EiPv9ZKzPzsQVni36Sqig/zyleRGd5dhn+RajuaYKmu21encgm/qaMo+pzjM+/h0FE4RyczK9pIh3Xg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786459192; 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=KOt2p99qli37aLiRSGWi+DGEsvQgttAGvPBuWfl5IYw=; b=Cl/f9QfiL96DghnBP/g4rufuW1EI38AKtmHZx4mZjGz+RWsCvEO9wJiDRvN3N1cIbTcM8K2+6lAt0tvLReqlXd51exhO9IpQUdKkX9Ju4nmKYC7WihS61odL8fznPKTMGwXRo+pKG2Q8+pUgjbZqzX9D2uVFBvhmo1oQxWJ0VJs= 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 lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1786459192772600.8000834721256; Tue, 11 Aug 2026 07:39:52 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wtnas-00015H-H6; Tue, 11 Aug 2026 10:36:42 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wtnaZ-0000NR-Cf for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:23 -0400 Received: from mail-qv1-xf29.google.com ([2607:f8b0:4864:20::f29]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wtnaX-0001x4-Ja for qemu-devel@nongnu.org; Tue, 11 Aug 2026 10:36:22 -0400 Received: by mail-qv1-xf29.google.com with SMTP id 6a1803df08f44-90a6b298887so1159966d6.2 for ; Tue, 11 Aug 2026 07:36:20 -0700 (PDT) Received: from localhost.localdomain ([198.16.145.87]) by smtp.gmail.com with ESMTPSA id 6a1803df08f44-90a6c26e074sm681286d6.2.2026.08.11.07.36.18 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Tue, 11 Aug 2026 07:36:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786458979; x=1787063779; 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:content-type; bh=KOt2p99qli37aLiRSGWi+DGEsvQgttAGvPBuWfl5IYw=; b=Nmyc1qgrEyvhz+Bfto2QFD/vjUDOl0zNgc+qifywD7WIgT41jTSjBDjoE+zNKoyIj9 IELeOF3sW4QFd2f3dWrzrHdrz/fzo25V5ohqXtsAbXyzcy+1rlM8GrETP2jWw0jruNT/ DNFeON7cXs0brqxEFycB0EwFhRg8RNql1UUjRHuRtjiRamWBtytjKCnnOSn7Sr2QvATA oN385wFRz18ooxSsVNZDY/u9PsVenwKJBcVy5eH3VatiEPH8KMKMl0RD7nM+4fnas4Ii Xq3l3Up4/eTaizLYUs9BnrFNZ6M/II2AtLwpGSqZjsPAhjXfLtWLueQMrMSEalaS6oxL RzNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786458979; x=1787063779; 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:content-type; bh=KOt2p99qli37aLiRSGWi+DGEsvQgttAGvPBuWfl5IYw=; b=arHIc7dWYQedif+KyINg9K3D7Pvr/dPuIucwvYVlvVjSk5ESPbGjex3jxWKVqCE2k5 zle0o0wQYjjO7XrhAJLH0hGF+bnd07OnwQ/l5KAwh8U5GWatKXb2woihBF8ilvsg6oor Iqtzxz2VYbmLUy1DQP/acCsdTqb1ac89ZOH8JfKZwCV+S9Ya8Emg/RGGCkyGhucJY1NY HxmJ5/EPcL1/NB/1hMKzaKTI5D5sJ4/+9jIpLl4ebO1CdP2auVKAw7BQjAlegqA55lDX GteMrDajb4Oy0kluSkMq7aDqM1SXgPKihnSZdud3jPP/dXcC/yfQcprK1sgeNGqpeI85 PAQw== X-Gm-Message-State: AOJu0YxRFbdssBLbSS3bYnHf7Mwj3pmxwlywXmSLLjv+8cE6VCsWabop dZ8x9NpJF1RmHR3fsr26BbwMlhiOnQvq8X+MGpWT2kJWmhpO6o6RfUPXN0Bf/w== X-Gm-Gg: AR+sD11V4lcC/nDm4nxMlxj7iJIm7cgSzcKOxNBG1L6/jCd5i252Z4aW3KzIQ+uxLVi 5kC23HvtgnV0aTIK4m6JqcMR8ZVSKl3aEgWTepd36Vcqh9HiwuhzwtL3nyaRslYwopcEMfNJKm7 f6xOPYYQ6e+SmoKJNkIqTgLxPd/nN2SXA8wUqqUWF2QP4klpxofTw3ThBL9qZUVZt0vcBSRUZze ov70D2mxA50Y8/hxSMzvu6Vfo/GexK1/eq5HA4j0MyhvP8lJxMLmRM1uC1Filb/nReaRPLMNJkC wYwlBMA1iI5hthmRuQ1TlYiZSi3WEaGy/qBAtpOYoF1D+J9CRsMo0QeyQwIn6UHsDEE81IY+0vE xWP9lL8CgiDLRQ+UgK3U3y5AvmfIP8wwCHNZ1mKmRu5zolaNLspUeWLtvamZutnkTjtUpttwzjx WIiMZZCreCmx6fx60goWYQmhjdxZuqWPvTgFzQJmmwAqt9vFBvOLeAIMMdcONV3rixiwpHgSL+7 x3bbHD5pyNubav7mgo= X-Received: by 2002:a05:6214:493:b0:8ef:aad6:dada with SMTP id 6a1803df08f44-90a66ea44c6mr32735916d6.20.1786458979436; Tue, 11 Aug 2026 07:36:19 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org, qemu-arm@nongnu.org Cc: Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcelo Manzo , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v2 19/19] tests/functional/aarch64: add raspi4b GENET networking test Date: Tue, 11 Aug 2026 10:35:56 -0400 Message-ID: <20260811143557.7862-20-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260811143557.7862-1-marcelomanzo@gmail.com> References: <20260811143557.7862-1-marcelomanzo@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=lists1p.gnu.org; Received-SPF: pass client-ip=2607:f8b0:4864:20::f29; envelope-from=marcelomanzo@gmail.com; helo=mail-qv1-xf29.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=ham 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: 1786459194328158500 Content-Type: text/plain; charset="utf-8" Add test_arm_raspi4_genet, exercising the raspi4b GENET controller end to end: boot with a -nic bcm2838-genet device attached, confirm the guest driver probes it ("GENET 5.0 EPHY" in the kernel log), reach a shell, and confirm the link actually comes up ("ip link show eth0" reports LOWER_UP) rather than just that the device exists. Verified locally against this series with the exact kernel/initrd assets this file already pins (raspberrypi-kernel_1.20230106-1 / groeck linux-build-test rootfs): without the "fix PHY autonegotiation-restart deadlock" patch earlier in this series, the link never comes up and this test would hang at the "ip link show eth0" step, so it also serves as a regression test for that fix. Signed-off-by: Marcelo Manzo --- tests/functional/aarch64/test_raspi4.py | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/functional/aarch64/test_raspi4.py b/tests/functional/aar= ch64/test_raspi4.py index 7a4302b0c5..0e254a2034 100755 --- a/tests/functional/aarch64/test_raspi4.py +++ b/tests/functional/aarch64/test_raspi4.py @@ -92,5 +92,35 @@ def test_arm_raspi4_initrd(self): #self.vm.wait() =20 =20 + def test_arm_raspi4_genet(self): + kernel_path =3D self.archive_extract(self.ASSET_KERNEL_20190215, + member=3D'boot/kernel8.img') + dtb_path =3D self.archive_extract(self.ASSET_KERNEL_20190215, + member=3D'boot/bcm2711-rpi-4-b.dtb= ') + initrd_path =3D self.uncompress(self.ASSET_INITRD) + + self.set_machine('raspi4b') + self.vm.set_console() + kernel_command_line =3D (self.KERNEL_COMMON_COMMAND_LINE + + 'earlycon=3Dpl011,mmio32,0xfe201000 ' + + 'console=3DttyAMA0,115200 ' + + 'panic=3D-1 noreboot ' + + 'dwc_otg.fiq_fsm_enable=3D0') + self.vm.add_args('-kernel', kernel_path, + '-dtb', dtb_path, + '-initrd', initrd_path, + '-append', kernel_command_line, + '-no-reboot', + '-nic', 'user,model=3Dbcm2838-genet') + self.vm.launch() + self.wait_for_console_pattern( + 'bcmgenet fd580000.ethernet: GENET 5.0 EPHY') + self.wait_for_console_pattern('Boot successful.') + + exec_command_and_wait_for_pattern(self, 'ip link show eth0', + 'LOWER_UP') + exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System ha= lted') + + if __name__ =3D=3D '__main__': LinuxKernelTest.main() --=20 2.47.1