From nobody Sun Jul 26 10:07:05 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=1784941516; cv=none; d=zohomail.com; s=zohoarc; b=Cn5TbxSxkHTOURjpsdtfxgC99KNzqdiWCTOZyDzeMqz0fpG/3x31AJZcEaAYnc8j2AH3CaLE6O976xJYLY9Ga01WFIjxVQShqlbAJeJm0xZuNQ/qQUM8L2e2C91ASNKRrdyYc9dnvIVaIr2w1lF0fTGCoSBhBAPoGRUe41Wf8JA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941516; 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=4+kYWqcfqUlxkLr4U0JT8RRf1UDUi8bzrR2cXy3DeC0=; b=EWTHJMyUAfYmgNGwjG5ofAco7Lui5rXETHQ94ACzvNaKxzF/IRRbdaV0HIL88qxvYWDCfRu2qLg7PxPH6dIIpnFwVg2OslWGiZWHP0/0KGafFexPQA/s+mG3E9tLR4KUhB4gFJ6VzdzU/uadriomMIlvvI8vqBxlX4EPhn2bZwU= 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 1784941516537451.53754941141005; Fri, 24 Jul 2026 18:05:16 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmv-00025l-Pd; Fri, 24 Jul 2026 21:02:49 -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 1wnQTC-0006uW-6T for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:26 -0400 Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQT9-0000lq-TV for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:25 -0400 Received: by mail-vs1-xe34.google.com with SMTP id ada2fe7eead31-745497ac8fcso361339137.0 for ; Fri, 24 Jul 2026 17:42:23 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.21 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940143; x=1785544943; 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=4+kYWqcfqUlxkLr4U0JT8RRf1UDUi8bzrR2cXy3DeC0=; b=LdfCzFrr4G7+8Pw/FGJAe2Z7THynleCSLyDAPWZJWTf7pX1sJRihaKaogKpROWMxN5 lBxBqFGY+XQhT/wosaw2FlQp8cXOBboQbVNat87li1rODEh5PYC0DvyBGYh6jYzq2EBm SMa5UPSFfxT31FbweqbZDC/1/siIqa5uOa6HnAufdgPI8tptfPiJoGYvriJVMwG1st8i fjkxbU1sExm40XEf1slGfNTCW264sSgnXPejDB6kNUDg3baC7Qj4GW8E7BYX9APFgyfV ubVTp8mGG8tVmGLFgGg89sCWkOxak8qg8O0MclpUnZJFMbFYTmNT2LJIKRbblpORLI/J a4Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940143; x=1785544943; 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=4+kYWqcfqUlxkLr4U0JT8RRf1UDUi8bzrR2cXy3DeC0=; b=qf+q2Z6Jf+SBUGnR0WLEWl2nuQ3UI3D5930Y7BBIPh1YAPVlMGKnIDEoC3/Y6HBXK8 CoxLCcu3XgFEkQ9pwmOIBAlHbA8q9ZxZO+j2maMl3r3+i/6C9o0xQGt6pBuCAGMNTCSm IZX6RtfJQTyAhX6ocY4s57AonXLBly4hZWrrgP0licVeQ27jo3XkZPQDZceKQp1V3YNq iMHwxUt7syE80s0rbS6zGL5ytNFYW9CtKhWfajx6NwS1NEbmTbeSdRK86PucpxhujT/S JTzkJMtpu0SgE4oqt/7T3snlahsCYGgt8LfIFot2zlkM2x/TDoi7zGJmCcjDH4cZEuG3 XB5Q== X-Gm-Message-State: AOJu0YzZEKFeCMgtxnUOi4wXNma32L2JPpD4WJbCPj7As1OD2ReY3uaG /8I8qOZDsEKlhxpv/5nCNhImAYb5Zob/KKRfbSe77jM2Hh6vT4Gw6D66XDSWow== X-Gm-Gg: AR+sD103N7etJpNE1di3rh8gD02K4hNivX3RAUi6T6xyD2Ps/3WX7zDW3QGy2S8AQge hn89Xy9m0D7w3lf5UgzgwuK6nmuDcFUT18QwUzTUfyrWbwc90rCGt3E6qAqYUNV9RoIM2hZkBlh yUdeQkx922agGyI0l8WyDP2J/mxVAUIGCTFlqztu7pkvxendXjzSEEvM5s78iunD8yHrvFfyAPj ZUHp9VGrVlRd1VOktLi9DxRdJA90xWbPQ0u/qTuoG1287N8annFZILyqq/W2jHVZ/5w2ShmTuz4 99Pfu7F1xW/fByWYkOyyLE5hf5XRihGweNOab9whwbcMQ8Xp4VkzyH5RlTOprvBTJid6RJDJech u1E2GUnBrxAE1bVSczDvtojTjClTIkZK+yfz1PuLSURaIYNtA3/215cTBuWH3YIC4l09fHTL5zd K76tCnrHL6VCrcuWEuIWO2/bvQhwq/AIbV X-Received: by 2002:a05:6102:1593:b0:73e:5068:824d with SMTP id ada2fe7eead31-7503feb1c74mr625304137.14.1784940142619; Fri, 24 Jul 2026 17:42:22 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 01/19] hw/arm/bcm2838_pcie: add BCM2838 PCIe Root Complex Date: Fri, 24 Jul 2026 20:42:00 -0400 Message-ID: <20260725004219.66222-2-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e34; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe34.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:39 -0400 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: 1784941517641158500 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 00000000..96a45c18 --- /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 4233a800..b02aa346 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 00000000..fe7a6cff --- /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 Sun Jul 26 10:07:05 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=1784941485; cv=none; d=zohomail.com; s=zohoarc; b=dM5HHzBdX/PtJ+75g0ViHHY2DXuQRHH4YIzbEbBkdZEuY17WzOGa5pKDZrRN9QOkRJTRWNgMKUSg7eHjgFpWahKO5kKtK6vBDN+2ZcQdAsPflL8wk0/75rTewpc346RSD9wRtHG4EU+jD6WZ917SWXFQd1urn9AFjDQw1wnfqR8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941485; 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=WkUJW2JSZjuyfLR5hXvDwjD55p0MwEChoFFvHHZw8BM=; b=GS47UDMB7M6FlRw3iBTLFl8DFvH0fbhjln23wdDH+ZE9pJs60smHvtVrSOSnsuOFC+5mExwYnuZLLA8MifSj2vyL7fRF0xz50HzqMdjFHEqyTm4gWTjbYeTtkLW5vdcs8vdNtP2HYHbNeK0S6FIa9kDRyyvbA5Q9+z8c7VKJgWs= 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 1784941485567508.3004788537522; Fri, 24 Jul 2026 18:04:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmp-00022F-Jf; Fri, 24 Jul 2026 21:02: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 1wnQTD-0006uo-6i for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:27 -0400 Received: from mail-ua1-x929.google.com ([2607:f8b0:4864:20::929]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTA-0000lz-TB for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:26 -0400 Received: by mail-ua1-x929.google.com with SMTP id a1e0cc1a2514c-97017a60b06so348443241.2 for ; Fri, 24 Jul 2026 17:42:24 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.22 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940144; x=1785544944; 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=WkUJW2JSZjuyfLR5hXvDwjD55p0MwEChoFFvHHZw8BM=; b=YQC2RG8GSaECHV4EuvZzQ5wg2tj5b7MlTWkPLE2nrk/GaIevsFe75NpFG9VAtWLLa4 crHvNUvTTUL9MQoBKgy5DFMolU9h5J7WPcJ/sQ/yATGwQXSFK++1tAlPCFPpHs2hKdzi GXY2dmyRPL0XuYBzlOz+/B6l2g0pwzUSKhrs4bZy/uRbFdfAN3gMIE2g7b3ko5xU/+gP u1srE8bHYbTkq2xsFXE40dBHVXkpZhIJyENoDrTT4GAWVkvltfIc4dB2LlyZGsjN6tsg 3rdfKzwXyaWz4WDpob2M21a/sP/4QfCaoMANKkIDFyV6bE4QP/fbIP1hDIROcGGgUutj w4iQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940144; x=1785544944; 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=WkUJW2JSZjuyfLR5hXvDwjD55p0MwEChoFFvHHZw8BM=; b=Y8b6e+I9hoEGu0vUvRhbGA9/2otDJU/Ix4E8yRxO65z52uhHdH5j481VSisJgGEP3Y LblHIfvXVRaPK5rpwH29ylxv4cG7p3k8cVxFeY+NlB3UhX/pLcj5KLFMy6AkrQIrycu/ G+bSCIh6i8z+s6knRU1UPOBWb7P1x9j8TAonJ3ilHT6hFHMTuDXbEuRQUu0W09/pqEic HNsdHJU5QdJv6d/47+OaDs+SJjPZ0X3RkoUuqmq0s8nlfxL6kBAF7k8apgJi8B+Vsr8W VT7oUpfqbAhuLYCaZiOMTgGxmVJ1hlosvuZ5WlzO61H3Ka/0sxJSUdz/2hVhCWvp1ZpP DNUw== X-Gm-Message-State: AOJu0YzG2jw0N8LI4fS/Fa9oG6OkI8UEGhCdBKxfdVINupC9QZmDLrM8 q8QCXkq72nQZnQxyFgFAemXwgJG2uros/y6ueDswgT+AEY9FyhXyYl9UbpTIwP2q X-Gm-Gg: AR+sD104e0cJWhHs1ComUhoFTEw6i8FHplIaajGtIH+wq1aO3pE969xFD6z80wXfprH befQyADj6HuJjTOMVrrTKpzkJK9ChTSKxgx/ckPQhhmuHamO+D3tyNDsFTCzBGgZhVUuet8LWk7 AWMzIkzFMn/5zWXLznQdWIAy0KdGOYEwxhDEMbWoDAyYhZX0r71r7Nh8ZVmq1DxhmKBM5mZu9Wy TXQt1WePVbq3rF2S/Chttc05K0J7915rE+hGhC6SsO2vKerHt89odGqzE39Tz+WfxOkclBYp98N ozk9dWMD/eqLIRy8X6garzw/8NshTzrGhchH49jHf1kUbrr+LDAlLk6DN2W+BtScLd1JHttkBn8 avdYUYE1SrncJeXTzsohmHkjaWOyOSM9DPw4IBBbTGpHYEtNe4IEaEOfkNxCk77fk6D/2qile1X o52KAEVu6oZPS6zRs4W/3dQNN8aGXy3nJY X-Received: by 2002:a05:6102:50aa:b0:739:4470:d8 with SMTP id ada2fe7eead31-75040dd067cmr694193137.26.1784940143695; Fri, 24 Jul 2026 17:42:23 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 02/19] hw/arm/bcm2838_pcie: add BCM2838 PCIe host Date: Fri, 24 Jul 2026 20:42:01 -0400 Message-ID: <20260725004219.66222-3-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::929; envelope-from=marcelomanzo@gmail.com; helo=mail-ua1-x929.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:39 -0400 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: 1784941487517158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Add the host-facing part of the BCM2838 PCIe Root Complex: config space read/write dispatch over the extended MMIO window, IRQ routing, and the PCI root bus registration that plugs the root port device (added in the previous patch) into it. Part of Sergey Kambalin's original Raspberry Pi 4B PCIe/GENET networking series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Ported to current master by Marcelo Manzo: updated the class_init() signature and header include paths for API changes since the series was originally posted, with no functional change to the logic itself. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/arm/bcm2838_pcie.c | 215 ++++++++++++++++++++++++++++++++++ hw/arm/trace-events | 4 + include/hw/arm/bcm2838_pcie.h | 22 ++++ 3 files changed, 241 insertions(+) diff --git a/hw/arm/bcm2838_pcie.c b/hw/arm/bcm2838_pcie.c index 96a45c18..1596145b 100644 --- a/hw/arm/bcm2838_pcie.c +++ b/hw/arm/bcm2838_pcie.c @@ -17,6 +17,217 @@ #include "hw/arm/bcm2838_pcie.h" #include "trace.h" =20 +static uint32_t bcm2838_pcie_config_read(PCIDevice *d, + uint32_t address, int len) +{ + return pci_default_read_config(d, address, len); +} + +static void bcm2838_pcie_config_write(PCIDevice *d, uint32_t addr, uint32_= t val, + int len) +{ + return pci_default_write_config(d, addr, val, len); +} + +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 + size <=3D sizeof(s->root_port.re= gs)) { + 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 + size <=3D sizeof(s->root_port.re= gs)) { + 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); + + int i; + + 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) */ @@ -62,6 +273,9 @@ static void bcm2838_pcie_root_class_init(ObjectClass *cl= ass, const void *data) k->device_id =3D BCM2838_PCIE_DEVICE_ID; k->revision =3D BCM2838_PCIE_REVISION; =20 + k->config_read =3D bcm2838_pcie_config_read; + k->config_write =3D bcm2838_pcie_config_write; + rpc->exp_offset =3D BCM2838_PCIE_EXP_CAP_OFFSET; rpc->aer_offset =3D BCM2838_PCIE_AER_CAP_OFFSET; } @@ -77,6 +291,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 1b16f710..579d4b12 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 fe7a6cff..18ab04f2 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 Sun Jul 26 10:07:05 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=1784941482; cv=none; d=zohomail.com; s=zohoarc; b=TTxYZQ85yN5aKuyv63U84YCvDvFYCmYEVnttjf1PJEROj3cFn01Cyp5AO44NjDE5DwiP69B9vqxuOZ9YDNNswrvUDqRs+u1rdU4ejGjMG2xfkuJNc+1O4RVYotxdXMJDlsL1vgoKZRF/EEIgozK0hB84auS4j0HFnurAQpTaf6k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941482; 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=/ZpwvqzsmTV5HSzyBuGagGo6j+vN1oaZHeXOF2t6KiU=; b=DSpPm4H7xUwXecrLcXoR4o5DP9kZRr9aS614tj5I5/J0+wRcsEv8IyRFBRAY4F7XlWTw3EX9HXb1aleUi3k8tFugLWVVbXtBD+aAviFZJsuh7uzvYas1Cul5vmp+YBtWep66tGQtCrLKH2QOB91DQkTtAq1ocLeiQoG+4basxoI= 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 1784941482259995.4843156582652; Fri, 24 Jul 2026 18:04:42 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmp-00021z-4v; Fri, 24 Jul 2026 21:02: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 1wnQTD-0006uz-Qc for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:27 -0400 Received: from mail-ua1-x92b.google.com ([2607:f8b0:4864:20::92b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTC-0000mK-0t for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:27 -0400 Received: by mail-ua1-x92b.google.com with SMTP id a1e0cc1a2514c-9770e900464so722814241.0 for ; Fri, 24 Jul 2026 17:42:25 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.23 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940145; x=1785544945; 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=/ZpwvqzsmTV5HSzyBuGagGo6j+vN1oaZHeXOF2t6KiU=; b=Sy1ylTWz+6JLLKoTksZsmX2xN9eEiyhRetoSY0o0aH2+BCEQ10k7gtOfXif0hdThRH YUlkQYAC3hDNXiMZcPvBjyObik62acPoMeIaak9qkfPa4/QN6Ea67OBfMjwNF1WFKAGz IogCqLrHrgPRA0zxHfLoz/fnqtPNkdmJuQnVciUo+UKORIUJ2lNvw6YlxNcqzzOy8nSt bAcLAhUFb1MChHNKXWp3dMxeDFJIKoUWG3Z5podhl6fNbBhFGsKQtiDtv4g0Oz3yfI2l N/EE+uf+rb9goppOWGJ9QUaABFvHJybRhaBLCo5sG7W+hwGn/pBkEEUB6gSEMv2pjY08 rK3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940145; x=1785544945; 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=/ZpwvqzsmTV5HSzyBuGagGo6j+vN1oaZHeXOF2t6KiU=; b=kI4RlIPmYW4xEzmmFJf2XdhDoBf/iCqi/G2t0HVmswrwazWvEtl6oDnVZIUiVM+wRh zLBhAiUBW9+wztgo3+PaGK67V06FoJeD11XKIZ77VKV09fYQZ3mR7JjNf9d+v0hyASmC rE+IAgCAP6ZjOk1pbyZ8wEccAiKvq4vsWiaH7U44HI7w0cpgegEXc8d8FCbPtOuCLgkQ aQla7KLqr8i/MHdhf624GSVWzc7l8QW5n92JKIry6Tnhy1VOPXdTloy/Xvbl/KkBec46 s1jjTfCvn7NoRIYSKduXeFG+be0JxPr57pYL04VrXimRbr72znRyAzl5xh3vAvWmXLUs lzYg== X-Gm-Message-State: AOJu0YwPyJufL37t5qireojc3kjRboogP4ERHWkn6l2c7h1RqgnYnnnc +53LxBNUo3Kv60n6MMAyxotLD0xdPlAbIjRo9ABWcGJLBPZM0DbwhnAwa/Pc6j8j X-Gm-Gg: AR+sD11hycgoNUmc5pXq4aO0/JIljCeWgKX6LgVFMyKvOiQ0fMe5JmtjAzEOzVLZju3 uRcIW+Z4Bo/IHRBbZbkDggdK0Ol5oVCJQrE+FcUT3UTMog05Xg3LI2DUPR0kfZ4JB2mTqNUQMBO yEiEKA2i1C/AzfvOIUGOqryk6l0nUNxGe3lJ+SQC94b3v51KHN0rlMZZStakD1ZtQ2mB8/XD4mm xsKTyFTX5lVs1dQZXR6/l2NR/HimtELEoGiTLHXP4h1fvHHR4j1Bihn6jsbZg80WYOkRET9KMRe VD60Lf1Z0s6uSuTjtRs9nJmyHc0Dd6b6HawUHFd5eBxEfgXHTcZrtFSKg1kNpqG8NOk4oY4FJbD rET7wBHqkYh6dC8QFB4Z1+5ugQyEjKsxQIzq9dG1JI/mMMkml3PPDiO5FBZtyo39dI7nkoKIU/0 pJyFhA5+rfiFEXOUqtu9az7Mb4jLvfhc5m X-Received: by 2002:a05:6102:1629:b0:73e:e4ab:1c84 with SMTP id ada2fe7eead31-75049b36993mr562527137.5.1784940144846; Fri, 24 Jul 2026 17:42:24 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 03/19] hw/arm/bcm2838: enable BCM2838 PCIe host bridge Date: Fri, 24 Jul 2026 20:42:02 -0400 Message-ID: <20260725004219.66222-4-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::92b; envelope-from=marcelomanzo@gmail.com; helo=mail-ua1-x92b.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:39 -0400 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: 1784941483465158500 Content-Type: text/plain; charset="utf-8" Wire the BCM2838 PCIe host bridge (added in the previous two patches) into the SoC: instantiate it in the peripherals block, map its register and MMIO regions at the real BCM2711 physical addresses, and route its interrupts through the GIC. Also stop raspi4b from masking out the "brcm,bcm2711-pcie" device-tree node, now that the controller it describes is actually implemented. Adapted from patches 14-15/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 | 9 +++++++++ hw/arm/bcm2838_peripherals.c | 23 +++++++++++++++++++++++ hw/arm/raspi4b.c | 1 - include/hw/arm/bcm2838_peripherals.h | 2 ++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/hw/arm/bcm2838.c b/hw/arm/bcm2838.c index 089af412..fc56f879 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 812b5b84..f71937ae 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,18 @@ 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 */ + mmio_mr =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->pcie_host), 1); + memory_region_add_subregion(get_system_memory(), PCIE_MMIO_ARM_OFFSET, + mmio_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 06aeb8db..038eefb2 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 0be97e67..56c0c209 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,7 @@ struct BCM2838PeripheralState { MemoryRegion mphi_mr_alias; =20 SDHCIState emmc2; + BCM2838PcieHostState pcie_host; BCM2838GpioState gpio; =20 OrIRQState mmc_irq_orgate; --=20 2.47.1 From nobody Sun Jul 26 10:07:05 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=1784941477; cv=none; d=zohomail.com; s=zohoarc; b=OVA6zrObXYqq24mI+7unIdSlfgFHkcTwZy3YpX9pQwFzRTRnO9bQmzrnOoFphLcExP0KK9WygwsRQ8aoD204kbC+CFbRcHQlb+m10vmJZJl40Y9zapqpVxqCUf8VdNcbqmx8G9bN7S3L2ZaNTCieDBKBG+YECsgqb+iGXLYleqs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941477; 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=PRM85ZxQ7NPsNTwS4+uvymRHkxtMcwlZYeUH9jK5Ra0=; b=IsYjRRade4AR8QImCqSfd+OqDiAQBmjAyMjnOKg/L1mDlomrS/7/kPc6QDYF1nNN98AlQz/yC8/jWDqU06kNIR8mnQuLOFohWeKJkGPYnvIs6at2ERh/RZVTFHus0Xnh1qhV9bb7tXTlh2zS4dvCT/h4osfDU6NNY07aporiJw0= 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 1784941477716691.0078174287879; Fri, 24 Jul 2026 18:04:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmu-00025H-AQ; Fri, 24 Jul 2026 21:02:48 -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 1wnQTF-0006vN-4f for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:29 -0400 Received: from mail-vs1-xe29.google.com ([2607:f8b0:4864:20::e29]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTD-0000mi-3T for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:28 -0400 Received: by mail-vs1-xe29.google.com with SMTP id ada2fe7eead31-7466771f1caso410952137.0 for ; Fri, 24 Jul 2026 17:42:26 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.25 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940146; x=1785544946; 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=PRM85ZxQ7NPsNTwS4+uvymRHkxtMcwlZYeUH9jK5Ra0=; b=UsuZctpqR2CpAumer0D7y4q7mFg2AkTvMuqVU6PNkUzyaGMIHpRD2mT+DDHSPNUt+H qnvc1yKTkRsw7duO0QSL91D4egsW+N3eD9v2ETSFGRb2ocGbEJWbv2jeDb1TLYaPvWEM xnVE5VNrRzUDtjasj3lGJaT/gTWyyH8fHTfsi094pLBlOWOSR5WzavVboTi6Qs3vwccA DFhfCQuD/LaTrsV9lS7A4e0jGxSQkUm1hoPGlhWPD+R3Sffrn6DHv8zs0fHlE0RGx3oX CA0ZubeIKMvPH2ehmnKocPRmZ57wK46RMdI/WGZ0aJNp3y93j4HYmXNfIFXGaLranmcp n7MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940146; x=1785544946; 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=PRM85ZxQ7NPsNTwS4+uvymRHkxtMcwlZYeUH9jK5Ra0=; b=RzMXIMiLY/E75rknLEMjZcD7rLUMfZg2oJ5+YraQXn5YW6GmMtUE5K+h9/Fu/3arx/ 9IziDTTq9IcOM1K+XN7wewS/Ykb7gqbde2p/r71ByTGA+a9tR5qm9L1Vapyc5WqqttCr wEJjT6zgdWzCSaE+ckt9FmApg5j+Qsnx/Rruy/xw6pc70JHUitcI5LKrJ2iVdMRPzzpn EoKkXRpnaSX3whj0s9AyExeVxwGBfavFpOEyDb76vRTT+4ELjKRqh5Cad693YoBWf5oX q8iEL/cmE1TptvkxNaOMN0rqvUaI0DVhRxc2ikhX98HinPcBtmgrMrAUcqLbe24fLOMF KZ8w== X-Gm-Message-State: AOJu0YxvutwjibVfCrJa1N6JkKgzPDceazke16F3bcnLI0+djv9BMqCb EF9CnIDFjHgq+lB56t0OV4ZiTL94CybvG3TTUmqsswYx58ZpfsHuQE8WMVmQTVHE X-Gm-Gg: AR+sD11PbCZyhfEdwA9gI4WVbeQBmhVWa2vErxfg23x1j+f7zt4ZXbnheVV+NUUFNr6 e0OiIbsc260qg+pbQFKUJH1H3K2FdmYuf1ll3QuAslyvW9D0KhxRFglOAjUUrYsL7TSbEsJPR3P k2YPEBvvjYE8hEoIfoDp2z68p3oN2kYqp5tYhwYs4IkYNQEKWGzHIUut539O29YeLbuY97B5Cf0 hRZTWM7iu/xWhqNlW7ACpoAs4qowMmDPYJXVUqg59eXHj+glEGCuAcPyi5yUZozLJR9UqwspYtn SnapZZ39bc4USMk6fnJ/mJutFXb0AdnHS41UqZDy31b0aVTrMBMJgvm3G8Uh87KmBcICgU3fUpw Im2O/lch6Z4bO4AjzwVy2a3vQfyt1dJaROtXowje7vdlzt+3bry4lBi0qpMMp80aNA9FBUzGok2 AZiHICzCc9wWt9RXs3sjPZmJVbRub1KssxTdavlgcjBCA= X-Received: by 2002:a05:6102:953:b0:74a:ca1d:7f58 with SMTP id ada2fe7eead31-750412f037emr717895137.28.1784940145964; Fri, 24 Jul 2026 17:42:25 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 04/19] hw/net/bcm2838_genet: add GENET stub device Date: Fri, 24 Jul 2026 20:42:03 -0400 Message-ID: <20260725004219.66222-5-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e29; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe29.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941480436158500 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 00000000..2ff93a34 --- /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 84f142df..e290e179 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 001a20b0..2dde33e8 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 56c0c209..903970a3 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 00000000..91cf1773 --- /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 Sun Jul 26 10:07:05 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=1784941467; cv=none; d=zohomail.com; s=zohoarc; b=MU9eZcwZG1g2qM8tWDooS1azjmELDRhp9smgqLj3nDOkjnbucid/QhiP0wq2TSFEsAxLLajY4I4y6CWR/XY730tpc6COWfXL4UOkpEP3bT53Ly6QGig6NOLZZNxbuOrahOSpSOHyZiA5RScMT1qOETdNpRSaHMzQG61RRMLaDZQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941467; 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=EQn31arufhUjZ3pCn24I7+iIrepCZMV83TWFpTHNTGU=; b=kklqiJih71VxVoDF9mfK62lXt4EKgrOcjFqer/queQN8i9R8UUZGC60hUqt+gnvtzq5yYqPbel9iqPbQuXmiFDRv7FrjJI1BODjbpBpS+HIfGIv4d/KnYXAI5WIYxk3aN0Bsn22JlVizZSMNyAicCsEl4ilCmOxHaGc1t5cNWng= 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 1784941467544196.63460045246325; Fri, 24 Jul 2026 18:04:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmu-00025T-Pg; Fri, 24 Jul 2026 21:02:48 -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 1wnQTG-0006vi-Fv for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:30 -0400 Received: from mail-vs1-xe2c.google.com ([2607:f8b0:4864:20::e2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTE-0000nH-HX for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:30 -0400 Received: by mail-vs1-xe2c.google.com with SMTP id ada2fe7eead31-736eea06c3eso384505137.0 for ; Fri, 24 Jul 2026 17:42:28 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.26 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940147; x=1785544947; 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=EQn31arufhUjZ3pCn24I7+iIrepCZMV83TWFpTHNTGU=; b=PqXbtJfzDxT09VXf8diXNW93VpXTQ9JPdL6+h/SRaOEjfiVWvQ781F27VDD0VcLoaq OsWMo2qmecHitkygWiwewE2g/dwK/s9HkDGyZha0DagG36MRSwmJtMXEOumuGZO4mySd EFIsv/4boZU7H9YTnqepkyf6g41wlwsn405YCsyUx5+5nzalhkyVnRclcxGG0UJbTYIg L6Q5q9l5tPTUvsvyoL/NRhCdlKjML6DeDV6Ulnf27yvtzfG+xuDVoYFKWz///LCYvXUe IH1BKaWtMfU6RKF3wqdoREjLojRY4S5YcMC8bW05Xvug3TpnjvnPV/txkV8S4WYhweUK MSPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940147; x=1785544947; 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=EQn31arufhUjZ3pCn24I7+iIrepCZMV83TWFpTHNTGU=; b=HGPX2c428Uig+Ije06tk2jeWT5TAxDbO3qxbJaAViBa2/1d3myCq7OHqrO+4iwgZtT vBamPVvz2I72a5uxf7kpm3BBoXCkPh9HSeG0002Pmwiedl3JJcFSnoEKtnXlPcc9vnf3 yXtZUwPjBhCXoV6Per1cFTxddQb667mwSuiiVMMLlfccU+sEzBtpSt+2moIHxYEI18+k pV1V+dM35ZFNsxj/4rcLKGWlTIeqADxXvHg7kyig/lPTOgxhdTsZqLA8g79wmUhsnssK QWTHmlRTek7zAydsZoeUwM9DdPWqDDYmC1ee9akcZZGKvIBfjd3+05P5B2zkuWVgAU0S 0gSA== X-Gm-Message-State: AOJu0YzE69OgPTlqEwnq0+Pp/5du48cy3RadFhMDRFhdhDBAiwzB3oaK C4VhNwdpPZiDaPdY0oq9uYJFiic1t89OdYfMn0KWDFL94YDCaeyuHhHAHREZgF2t X-Gm-Gg: AR+sD13Q2cUoBA7bXuBFeZmm0ndSGFHE4wkhctR1mrGm6BM34IAJ5bTSmJt+uuAoK9T cFWnoHnDQMDFUh5bNHX6tS5b+MyYsFrZFfaI+CvY0z2LQrEUnmLgzRjfNQXqIlh5ObbwUjBDjXR c57GQbMT8TwPSKyXvD6OIyKZnyuRNe+Ah7d5+NHuXJhEQl2E/+0G1+FnuHM3RIerkkswpD0hYgc W9jb/ISJPWKXdS2Q9yDy5aglQgutf99ZZUp5vas0dYe6V0RuR3COVoeaR3rgklq97+EuAg0pDGk 99AaJJYh1QN2Z0vTgo51Hix1ViNAACP4d8qpqIYtMnJndJlf+t6++tp4WSiHtIo27RwSTD5hwue 8Ihyzgfn2q3hrSdd6bRm6cWb337PCwsu4mpt45kwHVqZaVmWU7RM0Ckr01sxPZBwsfHbLXwuvkP 2wCDtpfGbzWCb+RX8oE4gGQxR1Ju60vJpgZC+/e3gL4vI= X-Received: by 2002:a05:6102:4190:b0:631:28c1:154c with SMTP id ada2fe7eead31-7503e76ef85mr772118137.9.1784940147350; Fri, 24 Jul 2026 17:42:27 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 05/19] hw/net/bcm2838_genet: add GENET register structs, part 1/4 Date: Fri, 24 Jul 2026 20:42:04 -0400 Message-ID: <20260725004219.66222-6-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e2c; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe2c.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941469330158500 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 2ff93a34..ff6602c1 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 91cf1773..af5e8abd 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 Sun Jul 26 10:07:05 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=1784941448; cv=none; d=zohomail.com; s=zohoarc; b=YLUV8yo4ID9T3ZJ2tHDbVHy3S8xDu7qogs9Uyvmkw3qSpt3yrXUFRZlSEzG+3FcXqr2mLj2qJXYMVdVqMzEe7OF9mEB0WlA8a77KgcagSg3BxofMHfrHuNbRd5KCmy5w0DsFPtAQ7cMIJAUHSVCRiaLEDATX28maC2clhHqg2cw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941448; 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=ULQiUUKETfl5XXs6acGhTrFSt59xD9witMzeBOvlHc8=; b=N0BWJBo/A7FSuQlGygvkp1OQYe286IC4dckChsamg4yiLUVgW2lbBba9QJNZPjJRPJvQBb5i++HKyG1tl+D/WHYhqH+I6+VeP1ax+4O/uawuKysxXcFecrEx/qqnBIOPPNvXuDW+eljx4MZL6XEEnx3fCLo2KdGwW0m/ZKFFuYY= 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 178494144839935.42569055586068; Fri, 24 Jul 2026 18:04:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmq-00022X-0r; Fri, 24 Jul 2026 21:02:44 -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 1wnQTH-0006wS-Ja for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:31 -0400 Received: from mail-vs1-xe34.google.com ([2607:f8b0:4864:20::e34]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTF-0000nm-Mr for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:31 -0400 Received: by mail-vs1-xe34.google.com with SMTP id ada2fe7eead31-74a9ac9cda6so508599137.1 for ; Fri, 24 Jul 2026 17:42:29 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.27 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940149; x=1785544949; 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=ULQiUUKETfl5XXs6acGhTrFSt59xD9witMzeBOvlHc8=; b=sYBR1HoYv5RW/zbBYs6hPF1pMT90NyWCvrVfyTmkrfpQJkTgDv0zcvf6pYXVD9anOc ycijKnQMGxJHZ7sjk2PPHsT0zVdjO/6f9tqVhNbJhxb6nG0aLRomcdSwCrw3TGxMROIB lkQQ1qnIhnklDHS+J4xtix3OjakO1qMzzR8Y7PTlE0bYA3eto3PJpTOLEQstiGfpkuS0 XdplxH4PHUZBZMRHvuy9YDjl/dhLX6hjaes3xeSfvO2gywnqBa8AxviL5Ipje5QUn21P aMncfJKmj3F27TldGygX3rqrY+yrhu7vcAN/RkK8lW6fu8XQnGPEMXLrDZ1m3HyEm3Bv k3sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940149; x=1785544949; 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=ULQiUUKETfl5XXs6acGhTrFSt59xD9witMzeBOvlHc8=; b=iJyCmCKgNoi8KTB0ThMfLwWa2P5ibzbSeLgvzBXOlTOuogUeABz8xj+3Su5tOcOmUg 7h+UpXGsPUBczNt+bV4OZZT2gJ4m2rOGpSUWtILw9K1U1rKbrX1UsKSqiyJ/tbyZy/rv DrZimIXDia/tLSinb5g38EvopASAsp8E9/sC2ntsm8jUj9dElnZDEPpd4XT90tsyMAio 70QgrqV87ds+VaXL/+E9xV66rcBp2BHFRBu2QFZ1frVW0K/RR9shwMpO0hKEu7+umqg+ kJqFOuanlUrd9xQH1D85giMUOVlYXTChRYgAbWcTTSlKL8HnCGujf0Mn73fY4uebUTF6 63aQ== X-Gm-Message-State: AOJu0YwMxxMfKLZrC/z5kmp9B4OJbdURLk3OJSH6FHgET0f9fwabXdQU AJqAJzQK9vSMK0AK8/n8JgvhGXUMy6kAyjIMrVA2IN3HFmk9ox7jjcCOtMedPeSR X-Gm-Gg: AR+sD123f74H/SpGGUhiNuWw1nTZ/iCCJT374exl6XQioAmqBR8ZLwrbFieF3FRJVgH B35zw8oq4iABcg8UAsZRUUOVOQkWEM7eizSuPo2A44XVetGIeheyc5ln1JBUvmRODuateIzLqp2 unXJNLp8VzSV99uZ8XUjuW7uf/oizqF5Xraci3oYPuVV/xq5reJ52cW3nNDCPlM5Q/nPrlTwx2/ lfQ/0CkXeSXDOA6k+YDQUj2z/FxDBDvmjuoqgjmTiF2mUrZLGI2+76WAOQYS1hrR0U3JcG8NqNy dUViJ6l8RbZgC+9E9vBOoTuUOGtXtOROTYycAIl9YT/QJrLcatQtcI8HWAs3XKiDp/6JwDohS3W hBgJA+lX0TMgzEOK3VXm0/MyiJfTZYjE+rPpbqdt7oG1+q/6RN0ck1VVAaWXKSkT+/I9Kye21c1 nhlZSgPNaTCJwt7OmKeN83JM7Tu/b1mSUe X-Received: by 2002:a05:6102:570f:b0:722:826e:1423 with SMTP id ada2fe7eead31-750407b9b29mr680225137.20.1784940148748; Fri, 24 Jul 2026 17:42:28 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 06/19] hw/net/bcm2838_genet: add GENET register structs, part 2/4 Date: Fri, 24 Jul 2026 20:42:05 -0400 Message-ID: <20260725004219.66222-7-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e34; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe34.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941449570158500 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 | 89 ++++++++++++++++++++++++++++++++++ include/hw/net/bcm2838_genet.h | 89 ++++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index ff6602c1..02ce3e34 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,94 @@ 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) + +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 af5e8abd..b3893c2d 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 Sun Jul 26 10:07:05 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=1784941487; cv=none; d=zohomail.com; s=zohoarc; b=n5Ay4bx+vwlOrjg4wg9Du1uB7OCRLWfG5VysBgSZ914CGM0fJr25ZmhFMilEDXTNpx9oBxmhPIBv1QNYixyMB1YdSMfskh8vv031RNlmvHx3TITJfJt+VTSR26r0cSAtFGDAG9YqTiK4F6SfgINgjNauqDxzE86qpgHLrufI2Go= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941487; 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=BKCzktrYiQEBlxn5mpG34rrLG4b9oySiA6cw0F3P7Fk=; b=ixh3LFT1b0+HSQdroXK9FEpbCCYEiS2OCqXIcb+iQFeXUgjncalVvgWf9fglL9loiySrOCUMWBw7CQrC4lu8KdhwVJs+bMuSOLK+29QNT3F3fAoQboVtN2JDeqeN+/1bpDhm126cG/xdHNTpBjnlMgaA0wOsmP7GB/fnIC5Kn9s= 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 1784941486812443.34193350339365; Fri, 24 Jul 2026 18:04:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQms-00024R-8e; Fri, 24 Jul 2026 21:02:46 -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 1wnQTI-0006xN-QM for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:32 -0400 Received: from mail-vk1-xa2e.google.com ([2607:f8b0:4864:20::a2e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTG-0000oE-UG for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:32 -0400 Received: by mail-vk1-xa2e.google.com with SMTP id 71dfb90a1353d-5bf8a2932a3so420078e0c.1 for ; Fri, 24 Jul 2026 17:42:30 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.28 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940150; x=1785544950; 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=BKCzktrYiQEBlxn5mpG34rrLG4b9oySiA6cw0F3P7Fk=; b=Zrqpb+s8NvfFyslIal6f7VjQSy+tqklhu0ZrPZL/6WgE4w5fJrHeHlSCyGKwRlZs7r 2ERSddWi/GeLl8JiW68QGmt8cN+OVued+QQ5AsyCu+RzjljwNmQPVOO2hkcAqhPx5xCg ZuB21v+BO2BNtlZYc1u/4bT/qzm4RvmX3TrYGJwWzRzfxIsion0iQqzQCQzTCJd/bQHF kfBCjvHDw74LvLi36XtZIbYPk7/1SpTjXhiGtiWz47Ds5lLr/OykSR5KbRNBIxBSkUY3 xzwWUPHymL5/X4WROCdVEb/BPMGWyJ3VXJ9fazZqrlUos3LJQ6W51SjBeupdBA2+D5i1 wf8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940150; x=1785544950; 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=BKCzktrYiQEBlxn5mpG34rrLG4b9oySiA6cw0F3P7Fk=; b=M9bn4Pbtx3ur4+ueIxHJ55wsL0ZEC1vxdL61vDXoMv4R2A/Mjh9WMMF3c7UofZgLQo gVw1bx4tl01UzPoZUmqmalFf87D+1IVxuZoYlXw6eSOOJiHsp88egWbt5pK3tO9LOa8L MTbtJe0FVRrQcgp3m22WLaiT/o9wTFHfOQ7X1BALQmK1lxxo7qwWKP9edvZ030Qz9YX5 ZDnptRB7UIqk+xXt8WhOOvpLQNMuVGTbc8ToSEGNlihmq6y3Vb43QU2sSmKr4Z000xB5 qO9TJWacEeqqhqoQQmP3C/YshTjm8QV7nGMYx9rGdjMH72+/vj+zlTDWPYinNABtj1sG ey3A== X-Gm-Message-State: AOJu0YzgFGJ6ZzQRtuiPlD6pRxLjsfghJscM7Uuea3WM8oJd/lCSo3ad IbKVkMoqWrDtu1AScNCpTWB3xevoOZVI3H8O04IIkjh13PzVJVqdtQV+/nuO7ntp X-Gm-Gg: AR+sD11bvSvw/Ix/TMGxDYHeZ9XWW2TuGNA3SzyI2qmLEgNNOTOani+6ltuyKGVvLXa XX68hWlpSdzyPYAYhb7EnlPYAbCo+Ja1e2Hyvh0Mgto+Tpim5WJXspAV0405V09O2SCAfHKelua H4XkGHU9PhFMEHeOsk2LrUI4uwx5Ev7n5MrwlfjyZaTAOWGEb7iUwcpmKj4KUFMOnHTyPevDl/M H5/GYuj5EucutbqesAkcntIbt3HbQ3N5a7uFYCan+vZQGs1sx8UpIVp4IGswwh1/9GH4Ol8fRej Z3hu+wLCQm4sWXa3k3EN+G5gNe68TX54cuc0/oPMpbHrvs40PqPFXy/9cfTENws/5NWTiz9rf2+ rSvh8gIVnzMgfa5FsypJ0hoVcG48ruBLLXxYfvHmHYw+yd5SBGc057jJ3Z/Jt8hSXcKuZtWkWgW dNrpteTSEL2Ng6A7RR19XbKoRtJzIEDRAH X-Received: by 2002:a05:6122:1823:b0:5bd:fc20:1fc3 with SMTP id 71dfb90a1353d-5c306c0fae3mr438774e0c.4.1784940149831; Fri, 24 Jul 2026 17:42:29 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 07/19] hw/net/bcm2838_genet: add GENET register structs, part 3/4 Date: Fri, 24 Jul 2026 20:42:06 -0400 Message-ID: <20260725004219.66222-8-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::a2e; envelope-from=marcelomanzo@gmail.com; helo=mail-vk1-xa2e.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941487414158500 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 02ce3e34..3f152deb 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -146,6 +146,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 b3893c2d..fedfbde0 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 Sun Jul 26 10:07:05 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=1784941391; cv=none; d=zohomail.com; s=zohoarc; b=mFTYqCxAfdHcs+h4zBMmYMDQ66pzMcM8J7j2ThBghakP/zKCMl2ekI7aLBF5oZ5eflnrAjah0xS73PbvppGOtACK+llY0Ixm6mjiBfGbpfYy06g6xcp9Ojnjce2dl2KAOHDsxfs1mG8N3BMRq/kv9iqx3M1ue3kU85eCByfsH14= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941391; 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=PLnP2ltcRm+AptlSTX1goJ6Q09KA8SX8AKgQZ5A2kxo=; b=f4G3YJ9nk96grlIMrI/+OlqRv0Ry6bZYP3U00IiOessi6aQWM2PJzcNf7L4/3NUNq/cJR1yOKOjvVCnh7lzmvvdwhIG9+1+fWAQUJ4h+eBXuj2sCE6d+J+CxEP2RJYNAcbFfGFcBo4zh75c1GXKaXcU9MnHrIwaodiyOtzSRZRE= 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 1784941391450129.36101678798775; Fri, 24 Jul 2026 18:03:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmq-00022o-Pj; Fri, 24 Jul 2026 21:02:44 -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 1wnQTJ-0006xo-MS for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:33 -0400 Received: from mail-vk1-xa29.google.com ([2607:f8b0:4864:20::a29]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTI-0000oW-1y for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:33 -0400 Received: by mail-vk1-xa29.google.com with SMTP id 71dfb90a1353d-5bf94664327so387573e0c.1 for ; Fri, 24 Jul 2026 17:42:31 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.29 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940151; x=1785544951; 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=PLnP2ltcRm+AptlSTX1goJ6Q09KA8SX8AKgQZ5A2kxo=; b=AD1WK393FayqzIYtXiDsaX/c++2puuKXekmju+0NXV1EuGv4RM4YGjFP5Vh1YAh+Yk vGclL4/W0BmqdTmMMjAUxsEGGpBHRfGE/vXJVv7NdVAel470MpMc5GlwQxeMsomvcRuY Kjdz5SxZm/1/K1nGoqQ7tj9D785Xp2N/w9SR6meu+fLp64fIOg1w0zwqzgrj+HSm6ArT Jeq407ZCOXXjL/YJlvRrL1m6aleem5VzUOkO2Pa6d9mY+Gh8gG/R6EFGl73kdPFmdmYa IZ1DpnerG5cL0BZVYaa9oOLMAhW8qIDZv9QQtwpZo8KwFtWKf0pWyFPAq6UoIFRrr+4W VIYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940151; x=1785544951; 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=PLnP2ltcRm+AptlSTX1goJ6Q09KA8SX8AKgQZ5A2kxo=; b=X2q0wKbfO9FhZHoE2BG+FEG1vSr5QNLRw33Z0rdTzx9TvITEY/PMxwI3cgLjUh3p3J 5SU57vJVq5GmVIEvOZ8X9QpUwo/Nl1pPC7f7EQdKz1xYsqS6GiHJiwjiun+g0IhRn8J5 RiZXSUXEbZ/9glvL98yBW7sFO5jqJkW8EJmXYs4bSiDJGaRwiNwLcyS7aL0tzmDrkR2c o+qP2FnM5RFWTkli+1BPtovEXvChpPWnNGl7a2YJDQVGLspejJ8tdlbFXItjonruT6FP bOD4Kt7auo6g0VO9zx/LOX4MqauU5ZNMkssZBd6pi+qhYiarC5mkyw7MedGXkS6N3+UY ByvA== X-Gm-Message-State: AOJu0Yy6Ol+7Wr4yvrKgF8rX5t0U0vaU1vAgxCxqFnokaIDNXkW5UYIH 7qdDpOz0eztwRq8P2cmzLMpLYrXKgFkz1lO/dDY+aDeBPuxlwC0l5aTP/fJH3Z/p X-Gm-Gg: AR+sD10YZxfcQRerG5AR9sy/2UEfoyczZi1riB+ntIZIHznCR5b/TK7sPFNKD5UJ0e0 txsclo/DY24zBqfNfW5N3xnB8LQXaL5ssNZ7A5sTdGRNrLx1Ia+krFnHkQxVMlNj7zkby6Obo75 wipp5B0fpEe3DfbNeN7hm3KjWmT6QMKyXa7txqPX8cxZoYFK7wMTUQQRmPGxP3PRVJM4/Nz4B6C ov0XHuJMMqLNHOwcBy8bpAwN50gpbzdHwAtebazvFAYHWt6zC5D+P+iwHR67+Ql54s2W4GFH7FF vvE9PEy+fTslt0/vqbtsk/JVyEHDCGtUZVFqn14fl6jFSrYSmdM9Q4wS/mWrLQorHm2Rifkpjt9 nlrq89C5V+HkZsYD7Bov42Hfu3Mqi5VRU9O13aiOuUwzKwyUtjrBJFY53JrZF/hilTIphP5dy8X r3sTRZPXYYptCmEvzHxYsYEGhXY5OsR3sK X-Received: by 2002:a05:6122:8b10:b0:5bf:6cfa:7743 with SMTP id 71dfb90a1353d-5c306db29d3mr379064e0c.13.1784940150891; Fri, 24 Jul 2026 17:42:30 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 08/19] hw/net/bcm2838_genet: add GENET register structs, part 4/4 Date: Fri, 24 Jul 2026 20:42:07 -0400 Message-ID: <20260725004219.66222-9-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::a29; envelope-from=marcelomanzo@gmail.com; helo=mail-vk1-xa29.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941394854158500 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 fedfbde0..12439b58 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 Sun Jul 26 10:07:05 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=1784941519; cv=none; d=zohomail.com; s=zohoarc; b=T9nnOzaqmUHtVBH7iMT98zNoy+woheNcakEHnhwWj/uRayUVFkO72Hkva7ThLBEToY4DrQ9iDj6YklpEFZj8r643H+RKabJltQGRMDOGuPPbabCH0iY50IforC5ywVEJAtPIvQ0ooZc2F2Kaxnkpo//lSgU+WBgpUwt/OMCPXcc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941519; 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=gqReJ9ZWQzwvoyOtUqjX8DT8Y3JWdJ2h32YZcz5TmeY=; b=YJT2R2bUP+B8J1a61DLVDbQ5Do8QXb9oTBqOjsvK8VNzERYnXugyR9j36eLqkB0/pUZ2MAHCpl5MEAtKTF17lPTBpLaVUqnjyOg18xBq4Y/yrIDhQC+MMKqc3JYg2DxR0ivDEC7lMNcxB3OLiNA7wSHVXvpXMfBjN5Yvxxth6ac= 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 1784941519788832.1455492741043; Fri, 24 Jul 2026 18:05:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmv-00025U-75; Fri, 24 Jul 2026 21:02:49 -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 1wnQTK-0006yA-RX for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:34 -0400 Received: from mail-ua1-x933.google.com ([2607:f8b0:4864:20::933]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTJ-0000p0-23 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:34 -0400 Received: by mail-ua1-x933.google.com with SMTP id a1e0cc1a2514c-9667ea2fc22so250677241.2 for ; Fri, 24 Jul 2026 17:42:32 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.31 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940152; x=1785544952; 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=gqReJ9ZWQzwvoyOtUqjX8DT8Y3JWdJ2h32YZcz5TmeY=; b=dJhPT2jhp29m8J+ccoHbWWMCCYvdrILhCnbHb86EABWZRnzphFnlccjs8GtiUD1Yk3 810xbZ9RtKfBdCNw//hBUc1n49FfoXNByP3eqpCTCfT1OhxhaoVoWDI8hxUZxcpsahuR ccG1MGuVfdq6AO3aUhaDVOFOyB73GJTqwvg0q5VXq17ErBNwBWLY2NH8yYq8NcY6jdVA gswDo+cG7eeg119sjlcIje3DYjDgkhYtMdZMaj48K90V630gYgc37NRLrI3jKShPXWTi rtyNz56Jj4TgtDMFMmb8KLq7uc5CmotbJriCWKc6Dp/0yXaZK8DjJiK1inA0auNow35s 9VPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940152; x=1785544952; 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=gqReJ9ZWQzwvoyOtUqjX8DT8Y3JWdJ2h32YZcz5TmeY=; b=dO8PAGtUlLD4zoMHOhZukiW2tkgPhpIOOKZ1s273g4PijMMm0EC8ybB/KQCRwwJAEP TV/ONXZa9YF99qYEevQco9aedimnY7ijsj9uj1aMGzbPx2iOAi8L3F/PbQ4WReWxKq7H qOtmXgJuwNqMh0Nd5Q1lhU4r816sScf16ut2wqcl2XWJQVONPFk2yP4zYBVHjdmYJk4G zUm4/lqnbBsXZLEIqPhX02OWF9/ZfycLMeC5w/bM35omlLCGylzVViRZRU8X3b9obgYf TvBA3/aMfEBiWLdKFt6ZQUJnakvKC1/7ctcgFB/tFLULsyhAvGH2Y40bHhmjLndrcmQY iaHA== X-Gm-Message-State: AOJu0Yy4khNDw+u2OtfZWXVahfuYegJtQCzR678i0OtfF4ddR3vR5YZ9 WYk+scWInodOcRH+CxqwbabA2RkFNRP/CGSctIBs5mV0YXYFM0ZBjm09ytXmDTCe X-Gm-Gg: AR+sD11Nhe17Ku0ZpK26KdfnYO+cVBYELyd5quEa70VJVAOFG6kdfk8fPjW4xJWd6B/ xtYuZpH1mJt8baoV1tyfQVlWh7pwpSzdkNaLEeuXo+nWLPdafBpzLltfEp8ffnDnj8qtG268n8f MUOxc+9R/ES1Y2Ny5And/XVcqr1ixxPjrEoQXn+TIUMAZGLpk09DD5XI5XplwfOeWi6a5Yo4Qjo TjDBmg8nz/EpQx0jcTtI3NauVu3LEkBwc1qZI7qWiSxhngczpwqhv1NRIvQ99/rFu9Za2K+RtLK ibzDcRvrdrHNr/v2zl9Uswy5eBgfChQFlvM6QxZ6rYo7CDlMAOiLK8+yi5LRroSFwwCmqflIKYs 76tLa0paFxtsK5eQc2r++OHdVb29sV5o+kAFhDp/9o84q3TVBMNpHuDHIbmUP0ydG2szmjUpxro +rdUIHqshzcb1F55hv/yYrhtXmnmW6YVVD X-Received: by 2002:a05:6102:f8a:b0:740:177:f357 with SMTP id ada2fe7eead31-7503e06a5aemr788661137.6.1784940152011; Fri, 24 Jul 2026 17:42:32 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 09/19] hw/net/bcm2838_genet: add GENET register access macros Date: Fri, 24 Jul 2026 20:42:08 -0400 Message-ID: <20260725004219.66222-10-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::933; envelope-from=marcelomanzo@gmail.com; helo=mail-ua1-x933.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941521513158500 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 | 76 ++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/include/hw/net/bcm2838_genet.h b/include/hw/net/bcm2838_genet.h index 12439b58..d960740f 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -22,9 +22,85 @@ 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_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_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 Sun Jul 26 10:07:05 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=1784941505; cv=none; d=zohomail.com; s=zohoarc; b=Q++AbXdCGrgNdzNMEmFBM3Tsw0VXAVMOGmPqpso8O/qJVP5DKYa+Jb9S5GvbVzbEcI0VW6YKlL1N3TF0+MDiPSRhZcUCKE//8TCDqUfSM2dqAP2ufpppOPzmSptFXNIlUfiCePKkKnqGQn1n8EjGCHi7P8meOAlFWFanzFIVmB4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941505; 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=JPRu8Rb3pEdIQBfQsNcyquHCFyQhUPA/4R3yTphsbFI=; b=WW9yKj+p3sqNTjsz3e+sTs0yS4RVziqW9t5Z3sLzlP1uFiTMskUkBKakozwdSCcZ+CRH3epQZHlbZsIUkqk+29xG5g6OF/38pXIQ3XbLJRw6wttHGXdPPSq9nl1C9wMpKFTTM8EvEY5t3iakRdgbsVmNsezNk7D6lE9uQNVtyg4= 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 1784941505976555.8489697090057; Fri, 24 Jul 2026 18:05:05 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmp-00022D-A2; Fri, 24 Jul 2026 21:02: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 1wnQTM-0006yk-98 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:36 -0400 Received: from mail-vk1-xa35.google.com ([2607:f8b0:4864:20::a35]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTK-0000pO-33 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:36 -0400 Received: by mail-vk1-xa35.google.com with SMTP id 71dfb90a1353d-5c27e38ee18so501731e0c.1 for ; Fri, 24 Jul 2026 17:42:33 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.32 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940153; x=1785544953; 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=JPRu8Rb3pEdIQBfQsNcyquHCFyQhUPA/4R3yTphsbFI=; b=LsaR1ZZYJ5t33KNaWucClnT2rXIjA2WuCjYk2N3zyXpkPuix/RDid/e2pXEgJ+FC+D 82spBZx51/7PL2xc8G1Tdmb6eiU1p94ISpj31XiM0pDMU5oVcM0KPwSsCn+fZGOsOQJM IJbUahl1oHj4Y4PbZHOWyMwY1hR6Z4EK2JS2l27aS7p9rqhgjLr8OJsiQistkUIq77vU vvu6c/+URbJtyg7wOYqeZXyholcxkqTvKksCQiYo5LsZogdtyPrIKeVflgfBKA7v3F/6 soG2CKt2TJnbebTPAR7tXQ6jkIIoUYhTBAo7BTCO4rceia7sq6wLrJWSx0lRSeGolgvi NIeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940153; x=1785544953; 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=JPRu8Rb3pEdIQBfQsNcyquHCFyQhUPA/4R3yTphsbFI=; b=Tu0dU8gq8onks0ao3c4RJ7MA+sk0CCyEhmSus3XP4Xh5llOc+kvXf6G12cfPZ0BnXf eNqKrDxts+iRFeBhrWCfnvgy4vpB3XgGEGUpCOOzskL9b0X+bVoe0S2prABu1ynXjK5x B66mIhhMMNzbh3H8pmAQYvr9ig6audiwESPVh/p/OiEQVa1P8yqSv8vFUCLEtGTKFoM9 4OueUA6/QWMsE572kfCQkiA0DFRoGIFK6C/D90BmJHSdOEJvSspcG/IIAeMv0L2iYuAf IMFqXlja/HM1qYvSA84lOYsAa8YOeOJ+NfHjUq0IZPv+7Yx608qHRggpvl+pQ7nETloj UUqw== X-Gm-Message-State: AOJu0YxknWuRnT8Bkpi4l+bNrfLasBvYkBapYPz+eFLx1KzIFUrxjHMD QBf0+DY75Gf67wF/+6nKyOZyIFDObo5ITRnvJxTjBE56EwKXbqYTryyw81fNaDJA X-Gm-Gg: AR+sD10U3oKkd0DorP4F9Ij+NI0SmbwJTWBXtm4OBDFOf8lxgzewZDI4EQowOLk65Mg 8Rl3J7pz7xeGjDor83LVftOuBSMAs15QgTZbkqXzd8+O8eaPO61xUkmjp4In1lBiUNN+0O9y1l/ cwnXxZENrryh2l70ZqCcHouNvaJAaAjfpnBRaA7pfl4IjDauY3Oc34pY/orcvlZZlpWm5+6UYZm ryHIRmnrodwoN/buLTfW25Y4OoYJDA21LgHf6439GqdUOFWbdXZXqIcOltz8Fz13aSnSXzgEhBe jaIFf3uPdccyU72CLfkCcVsewwqPAaDUxQkhpG2tFgi1qELp33jAEiR5ftU5nsl+x65z2E1QU9E LcFOdSQGe+CQd1LfnwMgFk3+OUQc01psDzwnfxDt2SjrHZCsBFcyDKCAZso3TqmvvnUnaDJsEVV cx/0jFG0ASOp97H+CGDDPixaMbkHDtsaTizjr75MraM6A= X-Received: by 2002:a05:6122:46a0:b0:5bd:73b5:6d2b with SMTP id 71dfb90a1353d-5c306c69fc1mr428318e0c.8.1784940153052; Fri, 24 Jul 2026 17:42:33 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 10/19] hw/net/bcm2838_genet: implement GENET register ops Date: Fri, 24 Jul 2026 20:42:09 -0400 Message-ID: <20260725004219.66222-11-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::a35; envelope-from=marcelomanzo@gmail.com; helo=mail-vk1-xa35.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941507591158500 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 | 188 +++++++++++++++++++++++++++++++-- include/hw/net/bcm2838_genet.h | 2 + 2 files changed, 181 insertions(+), 9 deletions(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 3f152deb..112340aa 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -234,25 +234,144 @@ 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_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); + 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 { @@ -263,9 +382,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 @@ -273,10 +397,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 @@ -286,11 +446,20 @@ 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); + 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; @@ -300,6 +469,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 d960740f..27ea037d 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -388,6 +388,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 Sun Jul 26 10:07:05 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=1784941463; cv=none; d=zohomail.com; s=zohoarc; b=d04JjC+ivgzn8zDttTyAY4aQqYsm9nz7WNwFWigNNrNi0YK4JjTPl/mwdoRTFTcGXcftYVCHMMYt2NhhIFZAOZp2pDdUiuVt6Uh7GJoTf/gnU3lyL0o1jcksLnKOeRiuJer/A09iYc1XxcEcoeq+lY6BN6ulcjqXRMESl/Uy1z4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941463; 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=/aOgpR8Rc9ju+trXtQCwMCxiHBaSCQ0GoYhj/0mAI8Q=; b=d83uAa3XnRxGYnYo+fEmUkx9tk6vteMBOmLjZNntftFlZ0pGeyLDN/+GpHjUd0BMHXZVS1j4+J9KjUqf1oiuYN5k45lzpZ3NrhyK5xCxoxYz07/dGbb7uIIVyKzDhsWFTO0NF+fdi8b7FvgdPmQKhTgZzeMmAtU4tq3hVXvHOAg= 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 1784941463838214.12132155648396; Fri, 24 Jul 2026 18:04:23 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmx-00026U-0j; Fri, 24 Jul 2026 21:02:51 -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 1wnQTN-0006zJ-4Y for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:37 -0400 Received: from mail-vs1-xe33.google.com ([2607:f8b0:4864:20::e33]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTL-0000pj-7C for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:36 -0400 Received: by mail-vs1-xe33.google.com with SMTP id ada2fe7eead31-738a5cc517eso689851137.2 for ; Fri, 24 Jul 2026 17:42:34 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.33 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940154; x=1785544954; 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=/aOgpR8Rc9ju+trXtQCwMCxiHBaSCQ0GoYhj/0mAI8Q=; b=ealaHVTi5/zk2UEt4+vB9OhSNL1jWajylNGzjw3dP8qjp6MyKo/g/tK1bUrhYPQeOR mu9IACjJpbO4DpY7n7KhMbu5UNLKMRQmx/rp+dOdZpoL++CO/9lW1rxe9PLxIx0fYPMv I1L6b+Sw+CCxx/HSCe+S9VtbJoWXuUqdaTIylivk5koTIL9a4t6sxZDuEVxlfG1UjJja xr1CSXr9Q8mtMmEYuy08Glac5HtMq+KKLr3aOt/hmwLrbrppQs1ygkyV145h0veBf/Wf o/Q+4FClmvq/OLmCR0ack78cFkjH41Nj/Md2CPegJl9j1KD1nl80Dhn0VgVPBnLWdqiA YzUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940154; x=1785544954; 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=/aOgpR8Rc9ju+trXtQCwMCxiHBaSCQ0GoYhj/0mAI8Q=; b=ed56jYGGi3tqIzteXixFSpJadH2Wf5+DSgTeawPoKtg5E2H4Kr1tp5bEgfk6yfv50o r92QjG7wmAYU+MYNk/oMjp47482f/GQHIur8ZY4vTQJADzRCquCbRFUUNgmmx9lGnSe8 k/3HQXP0jc4exDhkesL00NjdNvB+pR0kkzzC6OQLdyYJW7kVNnu9reagfLLZsgvxfdrM lbpEhr5TZrIZ+fJ/Oi/HofWRnVBbRoyXnscBSUL2ov+oiJh99yZ50dpQWQAkL84nR5vp kr/XIvBR4Q92GntfpbI6OviLFRlvESsdEDXUDCDXM31bk1DxoZ36dcDKZgxSEs8Cikhm bOlA== X-Gm-Message-State: AOJu0YwPMGZgXPVO7XSC7iYhokdIyVHZGnRKGI6vQtmq1apny3nxi87R XaaivCw9K09Pucht8Lt5xA7ahysAtF2tu2aPi7wPUXeXPwxCbd95/C6cFxFemu5i X-Gm-Gg: AR+sD11OxOzt1fMPkaG5D4ZOPb93FwGug+aZmSrieaXXXoPpw/MJNRQLDK3FOvGur5c Q+s/kxrhdYynr5gtY3AuFg267pR4hAcUuEzUD6bhciT3xhhkKNZy5bperY28tsaf01aQSZpu0SF 4vfaKe/MhwV6DC3G3eRgNb0NtPucPbHsKMYekbFy+5POiFiZfB8FlufGaZDZBtdEcBEeqUEPRSF aho5anYVL64Oj3zLTQoCBxPF0X5YBLWYZPeDupFcb25v7P/FQGdEVA6eXR60TquxAOc4ISVYqW0 teqauNIIteeiCnSzIsbfWm8lDxyOtm6hy6H4HDBp9XeoDhpw6o6ZMLGwnfHVFXLo3T3qkA1mnHK 36gkne3RTZjtwJgLrH4nmUIdQ4EpMr8BvAY5S2fekBnoagIz0tUY8z++kfF90eQZU/u72QOTCkl 3XCPbNQ/LYr7aOmQ5UFW8Zc5ZR15k6rmi0 X-Received: by 2002:a05:6102:2c82:b0:74a:bfd2:9d86 with SMTP id ada2fe7eead31-750410e52cfmr658774137.29.1784940154061; Fri, 24 Jul 2026 17:42:34 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 11/19] hw/net/bcm2838_genet: implement GENET MDIO Date: Fri, 24 Jul 2026 20:42:10 -0400 Message-ID: <20260725004219.66222-12-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e33; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe33.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941465444158500 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 112340aa..7ab6815a 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -214,6 +214,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) @@ -270,6 +271,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; @@ -354,10 +478,13 @@ static void bcm2838_genet_write(void *opaque, hwaddr = offset, uint64_t value, trace_bcm2838_genet_mac_address(ncs->info_str); 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; @@ -453,6 +580,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 27ea037d..a5e06482 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -101,7 +101,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 Sun Jul 26 10:07:05 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=1784941473; cv=none; d=zohomail.com; s=zohoarc; b=hSfysqTSUXB1P7jLNCkA5PoopoDrEXugfTCB06uQr1BQ7mTZHnA/NXb08ORR99ezPRez+YlJhWRDSnPyLkQUWGqGYfdWDvpMn7D6L2Zt4qIxRdCmI5IIMPBEpqcADyMxQEUCfd0gU0FoCGDQNEmF+HTM/3GXAUi6uWpRPpgqk2I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941473; 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=JyRU5HOdFMiswMijymXTpoZPGwe7iOq5G9DNyA3fyig=; b=TsBqN24yAwGZ+sXNwNl8/Gn6GnkTg+bgD6rXIFQ6c5vp5rGl1GUgOxTSPKa+AybSdSK2cjg+o/BDFPEJyedgq34tlB/mX/bJwrogOYT2FpJsrOO4ZwUGf8bnBPVoHGSL9nzcpW8a4NklyEK9Desp5bBr8Yh1BYktvEWdts63soU= 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 1784941473775503.52825474499093; Fri, 24 Jul 2026 18:04:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmr-00023i-Q9; Fri, 24 Jul 2026 21:02:45 -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 1wnQTO-000704-7f for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:38 -0400 Received: from mail-vk1-xa2b.google.com ([2607:f8b0:4864:20::a2b]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTM-0000q2-1y for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:37 -0400 Received: by mail-vk1-xa2b.google.com with SMTP id 71dfb90a1353d-5c11362f67eso643806e0c.1 for ; Fri, 24 Jul 2026 17:42:35 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.34 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940155; x=1785544955; 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=JyRU5HOdFMiswMijymXTpoZPGwe7iOq5G9DNyA3fyig=; b=YlGKRlM6EsJuVsr5oUtii2BIamk6gt48OqtpwouT/SuOsCafKBHtJHBAuNn8mh/FKi 74kAkDn5g78WslHkoXN0caUnXPl4uvevuqphh34qkoPcRmghW8ZJzvXSw6J9TZHtpxMF BsADKn97tYv4B4dKCi9egfvep//Hvs+7d2uzK+xi0gacs37Bqv7Rfai/NFGGSrxHCqEN sKIo06MCjzNVpT4YcJ61+MDZabVkEgnfLe0Lf9QEoxzcHvlTFAhQ36GiIGg8QY2jK/iX oajoxA8QAwYyN6hHyslRIiHMzSkLiG1rEy5FyQMW1joiDZ2Xz2ct+tv8+kW84z3p6Wbf kt/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940155; x=1785544955; 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=JyRU5HOdFMiswMijymXTpoZPGwe7iOq5G9DNyA3fyig=; b=dTlR+5z7nw2diJmvZIGg5nB8uK1jO1F5gSJjxDqJolTwsCakce9mB8RpcbcfpOkxDb MLO34Cn5YRKn4vMATPx5ZdUlpxiHjZMJjIVmw6Fu0BdBEo4kczSNlEEM1lbYDftYKPj1 MCE/teunbfu5bwDsr5xPWOATZ6HYGJ9cbU0mKs+GvK/j18RLwuQ4TydanVGrPWOzM77/ Wtq+5SD7RywMpCtQzsaPHERpf1WCDyvCEH/k7JSxFmtXE7cxMLdxbComI5CIOdB25/Z5 A1Vyqh8QoUlRO+D6JIbLQkke0n1UQ97jG5IBz1sfIgI9Exr18Bs3lRRC3Tp3STVte1mi MMNw== X-Gm-Message-State: AOJu0YxOTmq0ac3XSTst19lhheIxdCqrkwMKD6BXRgL27jyq/8BrVIcJ slh5Ib2hgkOFxEhnin13UdtzbkcvlM3cWMDlVDW+EKJPhyCRHz0+/Td6jkTSy3Au X-Gm-Gg: AR+sD111WiLaOVpcod2AaVCUsEQ8z57yyb3vwibioiKoQS/+dl6b3bORFXxSHpSWXtu 4IEmfilkCG3oTsfCdRIv88DmbN5295132WOK+xb+JjoN7utmN3MG1MmzDIPFxfECgnDSfQgq/4c GSOx/BtN99B8CIZw6a62WWAvbYywu81G7ev5WMofBSA+J+QkSgWAULTrZPL20ZOu56i9/RCVDfW Qi2d8EuUls8/YiHqG4DN0eDyILtYI/Tev2mz3Mon24wDuEOAjMl5AX61TkahT5uRPebd9LW6S3m xnFUVSAsVkorqowYnL5pOb3Wj6nxVBwqF42T7yHt+VRqlzdbvhRY1fQIUmtzjQD/bWKfAC8pxAq M4bbnhejJbQ6nWTmH8sulGQAFOuwV05/Tq6tQQrjfRsOpYRt/O6snnBh5suK/alyEsZK9gOc03V HWxSTtkKP/1aiDjR6cy39w0qZJ8F1vewcSvZdaaoHWIsw= X-Received: by 2002:a05:6122:219e:b0:5bd:73b5:6d25 with SMTP id 71dfb90a1353d-5c306c20b97mr462820e0c.5.1784940155052; Fri, 24 Jul 2026 17:42:35 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 12/19] hw/net/bcm2838_genet: implement GENET TX path Date: Fri, 24 Jul 2026 20:42:11 -0400 Message-ID: <20260725004219.66222-13-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::a2b; envelope-from=marcelomanzo@gmail.com; helo=mail-vk1-xa2b.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941475862158500 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 | 221 ++++++++++++++++++++++++++++++++- include/hw/net/bcm2838_genet.h | 17 +++ 2 files changed, 237 insertions(+), 1 deletion(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 7ab6815a..378537ff 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -235,6 +235,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; @@ -394,6 +401,218 @@ 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: + if (exst_tdma_en !=3D incm_tdma_en) { + s->regs.tdma.status =3D FIELD_DP32(s->regs.tdma.status, + GENET_DMA_STATUS, + DISABLED, !exst_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; @@ -484,7 +703,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 a5e06482..0802ab01 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -108,6 +108,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; @@ -403,6 +418,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 Sun Jul 26 10:07:05 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=1784941508; cv=none; d=zohomail.com; s=zohoarc; b=LDMmuVy8sBHxZSgbICUCSe8Cj6xLOS33zL0W2HFG3u4sLY01sgM94KddNWnpQ4cAZnW7ThaG6Gzzp+p+F8nVQQXZlNU0xfbzznE3E+eQ4qfm434Xe/QZZkElU+HMFipnuJPLbKWu+UOVunvdQYHLkNrSmqA/r0y55ENS15tdICw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941508; 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=/dkvpIA7vhtGGrpYyMVV5DZMqTaMG+5vNrFJs2NURMY=; b=PCEBudLEI7U4qQUZpgTJaRxvc0s52e9eFle2Q/9byNdTOIbkZ/BhwVBaaADzVz+/hNkxk6xDoQFEUat2j6s67wkt5qHUXh86Br4zFxBwnCojnsRPL8ZC434iJxcYCJ7PiChQptvcdP3trUchcakPGFN0fRWFAIgVDl6gbSEcz9g= 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 1784941508429224.3024039800075; Fri, 24 Jul 2026 18:05:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmv-00025k-Nc; Fri, 24 Jul 2026 21:02:49 -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 1wnQTP-00070Z-4N for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:39 -0400 Received: from mail-ua1-x929.google.com ([2607:f8b0:4864:20::929]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTN-0000qW-0V for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:38 -0400 Received: by mail-ua1-x929.google.com with SMTP id a1e0cc1a2514c-9770e900464so722863241.0 for ; Fri, 24 Jul 2026 17:42:36 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.35 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940156; x=1785544956; 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=/dkvpIA7vhtGGrpYyMVV5DZMqTaMG+5vNrFJs2NURMY=; b=sZ7Ei7BWTu5/hfrXhHyOOACs19qnrjRw7oQCWQm9Cos+mR+gxijyJ0Vdfs1bsVr3oo se0wUPky40BjOE+wrxuvJnLnmNtrGD0nDTCEujY/+De9iV4W6i66pbjq5rqrcpf9HRGG Ci/xT74ZBrehGzsVobOhc/okdYjipnrBK/ZKJBv4lt/FhWnILAxT6lHxjdWlHULpIUpr RQB1SPzYM96cAD7cf3Eh/0IxBtBGbq+db0cMX/y4EDfXtKhp1y9RLBeMeI0KkE3CEO6A MtlCQbJrU3owyXHBzl3/aWDpfmNGhDrHAw51XePvsavN0dF002tDRwzNiARlKCG8/sKq xZvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940156; x=1785544956; 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=/dkvpIA7vhtGGrpYyMVV5DZMqTaMG+5vNrFJs2NURMY=; b=AlnKJK810jtuEaGTtz+hm7S/SLK1i8vV5AEaY20/ZaTvGRuCmbW6IqbbnYkfK5lFNF 9DT/BzcCjGQQqR/bCBdrVg/p++RhdsAII+LuzClftjfiaM9iprXVrr0O8tGzbLnSuKQ2 CWiSq1qqPwhkM13whqj1CwiccvI5y3m2Reo9jjxFPH9P27OsEdAYPIQvI3ejlUuy7LFm sS8BtFISsckZc/ewYz4rzdfqdTf90O0x5em1F47hSGA+koZvbfvV4k/ClufyJbm9Xsjc kccN9/ltSuSzoyY//b71sJhTVN5tf6I5AvxUhum9uG+zPCA+LFbphoRYLY36fyKNv8jc URjQ== X-Gm-Message-State: AOJu0Yzg7n2Bfc7CVQcQkBe4XqTaaiEv38RLolxvVD3kjyZ3gLYjB7CL L5gf8E9GV+KyD+lpMB5yvM70i67XkcSl7jAWePnXKZjROg5cdLWxixYNJLsolNwS X-Gm-Gg: AR+sD10XJj1yG/GGf8LA9HWo1Um+WXCUnReenEsxJhEcseZmOZb6V7ec8m96/WGNpNT N287BIWcLhOnS8UW13sVXcS1S2dzSlTfHzE5H69bxU/Uh2UWH/D5LXnLiGsa/cCdzqf9hXCILsq HvBJZGbDbggPjpE9zusYvnrBGexif56TgCWdz1QjTgWHlwquVddEPC/RbcFDojO1Pi23f7jjuGt 0szyZL8wKFYYJRsqEUjUvsKrPugdkRyD+7fSSeBgCCnXVryp7X6cGfHz5tahcb4hpMIGmGlfxwt lmuMq4tE/zA6Qpr4hwMUNNBXqo01yBcK8fRYL6ql3TMsyaUKI+p7c54NGCGDwDf9n+T6SgMdhtJ AanJ1foZszSkl/KzhKB1MyPSJJ7oOAvX8x2kD/LrkqhmjO+2UKiih8S/fq0r/4Y7tkFoXCQaK/G 7En/hBQ6AEDDDl/yt1BDvx87w9BDySBeVh X-Received: by 2002:a67:ed55:0:b0:74d:5456:b6fb with SMTP id ada2fe7eead31-74f9f562707mr1655738137.16.1784940155962; Fri, 24 Jul 2026 17:42:35 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 13/19] hw/net/bcm2838_genet: implement GENET RX path Date: Fri, 24 Jul 2026 20:42:12 -0400 Message-ID: <20260725004219.66222-14-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::929; envelope-from=marcelomanzo@gmail.com; helo=mail-ua1-x929.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941509584158500 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 | 265 ++++++++++++++++++++++++++++++++- include/hw/net/bcm2838_genet.h | 1 + 2 files changed, 265 insertions(+), 1 deletion(-) diff --git a/hw/net/bcm2838_genet.c b/hw/net/bcm2838_genet.c index 378537ff..59393d89 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -518,6 +518,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) { @@ -728,9 +747,251 @@ 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 (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) @@ -784,6 +1045,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 0802ab01..5944e0ce 100644 --- a/include/hw/net/bcm2838_genet.h +++ b/include/hw/net/bcm2838_genet.h @@ -420,6 +420,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 Sun Jul 26 10:07:05 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=1784941391; cv=none; d=zohomail.com; s=zohoarc; b=FOklvfVbosCjkGTgFIyh2N/9PKplfU0IuCB6UuoRfjAIrDqKpbzwo4MqnmJ35kva8a4hb9/8pYfoenG5wkqdkmKvzT+SN/w471Ypw+ZfeFiaovwGydAW6jdpgPefsRntJliK0eDFCt6x2ozFqMFllX7JAuKrcpYGovDafHQK0B0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941391; 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=1U3fZj9dgRgALDfDMiL9lvcCJHyc0ghvPvHqdJct8fQ=; b=EiV0PCf/sFxcSL9qUB35nlvPKEcPhSES9LfhSFIci1wBMuIj+MeTHuaGQbONMPXH7l/OhwcvfHwde0Jz7OKLZin8QXiYnbRzLjwj4WPCJhcmmipemPGthSxqy5iyScZM+OHyJtB8ZCUkpiq9UhLISngU7/fFBO3CRfZnkZJTt9A= 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 1784941391433757.9945883898639; Fri, 24 Jul 2026 18:03:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQms-00024j-NR; Fri, 24 Jul 2026 21:02:46 -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 1wnQTP-00070u-LV for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:39 -0400 Received: from mail-vs1-xe35.google.com ([2607:f8b0:4864:20::e35]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTO-0000r3-02 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:39 -0400 Received: by mail-vs1-xe35.google.com with SMTP id ada2fe7eead31-74d55dac06dso252876137.1 for ; Fri, 24 Jul 2026 17:42:37 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.36 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940157; x=1785544957; 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=1U3fZj9dgRgALDfDMiL9lvcCJHyc0ghvPvHqdJct8fQ=; b=Bw5Fn5Rh22FyRjT++bjqUHZVLfazzf0yytVolvYz0lJN2yXKbIre6yFVlJjgcx8uMv 0ZZYwZAZ8eQXp8AcABkGqNPa8p3IRPpvDJ8WSW1N+Tle8P7QJATpmyMcs3YWIyrhVqfd TOVVH3rp8I6YGh8fcJmGmo6giaySdV41/3enVzO2yEVpl5JbRAH34GBCROvLU+jJtIZn nAa4Pe6H6+sG0cLnHYOBdGtcKOvUHoIe/44Y/GBi8emS9XRsln5clT3QZypyBjji8Yyh VFYqoyaJPHmbSr2CYs0/beJBHEoddiWkZbhJp9ASxRovD0VRF7S0nOb8ZMuuhGy1KRr3 iiZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940157; x=1785544957; 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=1U3fZj9dgRgALDfDMiL9lvcCJHyc0ghvPvHqdJct8fQ=; b=dPqpenMafskdBCD+FqN8UOB3/TJ/pz8lrkVSwAlIo6qC59sJG+nnqxzhdOV89Maol7 /OBMikOpmTTfqi/OyMlS4UIvSPTxVA1UgsoHxgLVV0y8PHCpT/wV3JUak467OTc+M8Rf kFyl8InEmNvN9KRjNKNMDrG2BU1+JxF7L/aQTWm03jNwICltjtMNU0/ht03BtSZLn2s2 wGsZEQxBpvsxg8LAQrXpN4KFR7G2h9kAGPlZeNAI3ShTPMWaMlWIReTyEJf4WhYyKOmt HvO+cLet/NpCtWgGqR6x7SU4TeJYff99aEzqkRF9sGUnD+wKZCLawuDGZNBuC8illsM/ DVLA== X-Gm-Message-State: AOJu0YygN4QjEUXGOIybVfYtiyiEeGYt4hkQKmWWUXqDMxUa/7qSaDH+ Bi7SlIIRNKBDgwP21hfCF+4FXoJ6EInrkX6zaETnqIWevwAU6whHPSKHbXtnOIJ2 X-Gm-Gg: AR+sD12bWVACRJpL8jt6hEBVZwo58CKGcir8TyMhZLTdqNfQ5cBjCtjVi7x/QSl4ySv 1KqEtWIjZREBYL9yp7CaLCFx5mFoPmFpAXBhEHd1eiQyClUp60pPKNshbC5iX8m3fF2mOWm9gNF mxFhSF3KZKQPjkdEGaULg8xvjg7Irt4+bvMvxqNo+FJxcVnQx6qTsmq5eayQkIV+bG0uPwyaUsM GDNmNmmknUP03ELztFb+pSa46WAmYvwWulebFyGHIr+8Do/Xinatq1WbbFizCAh514CU0Eu9X1S Bl4s1cNxjJYbzj15vY5LpwhJRiybtJhhgFj6iOFi2sFQ/aXuduJInvrVfUUUif1Sa6uQ+b0jIR1 zRSJojmLVT92E8ug0S34m60bA5taNj9nSBR19XrHwZw9h2YCWyPozD/ufhH28sS7LTGrqXjkPJ4 USnxZvIvifkwcVZUYcPpWuDwi9k885KBfX X-Received: by 2002:a05:6102:149a:b0:745:6721:8c2e with SMTP id ada2fe7eead31-7503df5cc2dmr710793137.2.1784940156893; Fri, 24 Jul 2026 17:42:36 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 14/19] hw/arm/bcm2838: enable BCM2838 GENET controller Date: Fri, 24 Jul 2026 20:42:13 -0400 Message-ID: <20260725004219.66222-15-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e35; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe35.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941394888158500 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 fc56f879..f47b96c3 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 f71937ae..de49f48b 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 @@ -205,6 +209,13 @@ static void bcm2838_peripherals_realize(DeviceState *d= ev, Error **errp) memory_region_add_subregion(get_system_memory(), PCIE_MMIO_ARM_OFFSET, mmio_mr); =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 038eefb2..79f60932 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 903970a3..5da340f2 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 @@ -69,6 +70,7 @@ struct BCM2838PeripheralState { =20 SDHCIState emmc2; BCM2838PcieHostState pcie_host; + BCM2838GenetState genet; BCM2838GpioState gpio; =20 OrIRQState mmc_irq_orgate; --=20 2.47.1 From nobody Sun Jul 26 10:07:05 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=1784941446; cv=none; d=zohomail.com; s=zohoarc; b=n6VkBpACKUEClKyIthJ5A7JfUv/3jeJvlbkvDm0pI2xOPGyLnpT9K6noN1E8XeOgN+iUngizhmx38uP8edFg4b7mq66Se3HXC/Nj2U5zWOC4PNTLwtaS7DrczlzdfsMRgpmXPy+g4DRCWk/fpEyeQB7ahVXCMCJuQqnC/PRCKfo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941446; 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=5QfvYo5UsCuRurXk863Eme2dB9OKCaPHtZCuOSVqbkQ=; b=PZ/LSjdLH/pNviXngwZJR30MeZUdL+fTZ3hx7mzPS8wssdrqQp9bUbZYwZ+llQwgCQZBZdE4usbBKtKipoyzW1ZNNzJNqE/mWmWy7WA/7w22H0i0QPnNj58s+AQorGNgh+bH81ED23hyI1MUvCl6+YOmH8zOsFSX3NVn+JKoJLA= 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 1784941446099211.48414826185024; Fri, 24 Jul 2026 18:04:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmq-00022n-HP; Fri, 24 Jul 2026 21:02:44 -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 1wnQTQ-00071P-N8 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:40 -0400 Received: from mail-vk1-xa30.google.com ([2607:f8b0:4864:20::a30]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTO-0000rU-VF for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:40 -0400 Received: by mail-vk1-xa30.google.com with SMTP id 71dfb90a1353d-5bfaa014978so320717e0c.3 for ; Fri, 24 Jul 2026 17:42:38 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.37 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940158; x=1785544958; 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=5QfvYo5UsCuRurXk863Eme2dB9OKCaPHtZCuOSVqbkQ=; b=QYdWYdWMYPLxaHb+sLnvwVTeo92+QBQa5389acBYcd5T2KQWJp+9K4LfKrceqBg3mZ WJm0A4sY9tDvKbsHtd/TwwG5rbeJRw2D7c0FOEZdxb14DoXX7580NbM8sDCVm/lzFWdh IMGheC+hITos3ku1K6P5s/oBhmCMqsYDupaFNxY6BB0LRgWnrv7kVO0RRAUr/yhv7Gkl P8/sp99gb+Dg65WaY6kNPmOOMpIGHEmfg7VCkQRAcTZ4IYZTD7UNp1rrkxbzpd7CFukz P2061YKwO2rRIlhWakwQRAhEI043iOQear0IRng0XBRITyw2R1ERnCNDnj0ZgXMRJtrd nVvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940158; x=1785544958; 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=5QfvYo5UsCuRurXk863Eme2dB9OKCaPHtZCuOSVqbkQ=; b=bHu3EOkPi5KSN+bJxRWrU0Pcv+veYoRZe/BygUaS12fMfen/fip+0noOpRxOJ7UY8f yz6Z1Iaz3OmI1WGXZz3i3ghOt7iGTOvIbwlx6DF3yHRtveZn6TQwQgya6QAwxDevMCZa j+7GGAQkAjpijwDOYZMzkkWlDORgoXGtFlsO1vjFfNWptNy9LOXqyW16htVaIjXZQlN6 nWSXl/W2qgVNjAuPOV5lq2p5ySfv1a1bm3cWcsXanJjyxPqHGBtQxcK0GfMkpKDtDX69 GwAhCTRl6GfOVjawDCpalPeaXfpSXGrLZhduyNyhA43s9Phz72VxXiRdSdad+KwS0zdr Z7Nw== X-Gm-Message-State: AOJu0YysqA+7JyKjiWwwaRr2x7c4qVE/+6D7U6PVTNlA1AZocunrZOaV jqNJdCnpfqTS+fk9w89zQQnnqFVfIHaHiLiptTkMzLSI8vlAsXa4Dowt5U4eCA9d X-Gm-Gg: AR+sD10DbPSupfZV/mtVMIvLRC7rwvTzbKWIn8bEAKujICL5Kox3Wb9W5XTnZ5zjIXV SHy6TrNkHfIZ9bEB3IIFKS4nb6F+2nelnEKQr2HNfUnm0abVeGfzil+xOR1e9VMi1rZATcEi1d6 todZHePSuqNhTPtcdixHjGViXqqU4dHSaGybdVpwOPfbhpPc1/UcYK1i8OGgJVdPZf1WoD7NuPM 5fe4AGurxa51NvMaxACu2XeVj6vT6deAr0PQFbjDJX8TKExA4tpS6DoWxKapYnRR+Fx1i/njYMg 86fA+dsydtMLcz+vGv60MxCUAaS/GNxHj39e2cERTpx89wJovO00F5p8tagc0a6L12hWsuYh3ch DwhC0lG+ws/JLKOdEWHcYu9Bo5hzb0s+/qPhETHB0FRNMVrRCSb69qei6EUrL0HKp6eC92tWKze kjlrGegoTfR1sv7L/639SBvrbfHuOm9y3T X-Received: by 2002:a05:6102:6441:b0:738:9dd5:9b03 with SMTP id ada2fe7eead31-750400a8bdamr601594137.20.1784940157831; Fri, 24 Jul 2026 17:42:37 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 15/19] hw/net/bcm2838_genet: fix PHY autonegotiation-restart deadlock Date: Fri, 24 Jul 2026 20:42:14 -0400 Message-ID: <20260725004219.66222-16-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::a30; envelope-from=marcelomanzo@gmail.com; helo=mail-vk1-xa30.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941447426158500 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 59393d89..e34c1810 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) @@ -390,10 +392,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 Sun Jul 26 10:07:05 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=1784941459; cv=none; d=zohomail.com; s=zohoarc; b=EoOPxYT4OmvmZiVZDz7tZr3EQoEGtlb9WMpqtrwjmxbhT65OENcJwfCxKVRvCnHxAxrH822beDxD7QXENZocipTKfHh3+MgkgFDaGPQSPm3h1TIELcaj2ZU5sFQUSBPd1JySH5Ay7Fo02orRqLwMOGlrr8fyqMOMLHh+7ptJb0k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941459; 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=HM14Foo5RtrgA0ZcKF+/SRI7Q8dbPL9zkcGGEEENP7M=; b=UVr2pB4wgffinmrqWdi5o7MbThkqUxrR8R7YM0NzcPexImWYNntx9IvGMvfM1AxIks+SNvuPnFJk6CDQfquCK+bpfPxvXi57qy0r5fH9jdCEZ78zTj1c8GAceUNtXCC7Q+HaikkODv3IxBeW/MQjdvdqokmnLRXcjoqCuCf8DgQ= 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 17849414596911001.8711077423502; Fri, 24 Jul 2026 18:04:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmr-00022v-19; Fri, 24 Jul 2026 21:02:45 -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 1wnQTR-00071x-GQ for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:41 -0400 Received: from mail-vs1-xe29.google.com ([2607:f8b0:4864:20::e29]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTP-0000s6-R6 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:41 -0400 Received: by mail-vs1-xe29.google.com with SMTP id ada2fe7eead31-74748e3a4d1so465127137.3 for ; Fri, 24 Jul 2026 17:42:39 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.38 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940159; x=1785544959; 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=HM14Foo5RtrgA0ZcKF+/SRI7Q8dbPL9zkcGGEEENP7M=; b=G/dY1iagjVBGhXVChe1ru5WUgKgZ+KDxfdfM8g89PnoZw60GhPiovrXPOtqS83IK6H UWoBpxSesivdHzhJs9Ywq2VuwEUoJxhgon7yVPISxBGxoKl3UsxsM85njEhPnmP2r1B/ RnKrswkH17mT1PTC53WtMYq7vdVjmqEy44LrMnGqx516W60Y1tTDMYPqqtrzFsITnkO/ 4tmOV7NEb3PCUoG9rBgSyHQQ4LVZml+JzO4aUTwRC9YkdX4Dx9hm/u7X2ksLKZpbzGK8 9qWbw1ccvIGwD+FFVw+Z3m9zBHytpuv5PJ5e06h+A/Ks2ZvGcJ2W9u1VapnpXKQjfMzJ rlxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940159; x=1785544959; 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=HM14Foo5RtrgA0ZcKF+/SRI7Q8dbPL9zkcGGEEENP7M=; b=g6DlOP4F2McG7Lt3gIn4ytENJnzd5l5msBaNbuKxGTMON8bhdFCABbyGQHw7cktRp+ Gy50MdxMPi7FuTP6qmrO3uP74YgR6m5m45EGqLTA82CijEdtVUgsF69q8nLHDiSCNUjz v7kf5FU3235V0aMo1S5DwQV3tja9fo6b3pPwRH4j9Zy2kUz87TS6hgzA0A2fMY+/4Vbb 9iOcJ4IWAqR2ip4h5StyK1aiJV2PjvuuwmS3MVSv6EFLDlllfTkzEAJb7IlwS8pOSbPp C27GV8+zyAwASt+ZJVyIvdsrty+tfktzmG9hrTGKq1ExKK5OAUHm2AEh2Y66zHloHT12 tITg== X-Gm-Message-State: AOJu0YwYZzoNcGHmbu/2uXXVqwjSxo1bldEn3HYu58RjY+0GK7+gIlSU YD651Mjz1UJk6fe7r/2yDq7ogwmiZm+ICwYzSrjYg8XMBs7jPf+hEn9SDx8/6AAV X-Gm-Gg: AR+sD13nnPAvEklAecMfuhM6iT10CQs+0TH2pD+xH21pYwIbl+pho326MGRe5wcHW16 //ZGAtKSrfs1mCBMQ/2ODgviAON+ENkSeiN+VwkZe2ZM3ObosORARe7LSEqbPKP9+A1UZtjX6US IA1NdO9XHBqazXAxodqU5yCCFA3MRXXAAw8gIreGoV5+CFCcOTfHiU8cCOd0wkoO7wawcx/cYEN HHA7KN6sv5RbG7goZMApscsF0x2nyCERRGYQB8fHNsGBYfiGsC+HJSqmLi2CRtIiySPr3lKg9vY RMgS2CxQjzLYxddhjBb1qdR9pViAN+jqWaph7iA6kDWBg5dmqyJJNC15eMRt7NPYR3tSPk2Zvdj /uXOT+P+5yIpgvNOVJD2VVI9WGukXCtreaokD51c+slWvaV1dvXZCYOow0yuggQXEjJIB0J0GQX cc8xfDFtXV7LHFzmB1xjlrUkcfZr2+Kr77 X-Received: by 2002:a05:6102:442a:b0:643:80f1:350a with SMTP id ada2fe7eead31-7503dc56890mr807652137.2.1784940158906; Fri, 24 Jul 2026 17:42:38 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 16/19] hw/net/bcm2838_genet: fix bogus RX checksum reporting Date: Fri, 24 Jul 2026 20:42:15 -0400 Message-ID: <20260725004219.66222-17-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e29; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe29.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941461795158500 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 e34c1810..6f8f4e5b 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -821,12 +821,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; @@ -837,12 +831,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 @@ -868,10 +856,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 Sun Jul 26 10:07:05 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=1784941442; cv=none; d=zohomail.com; s=zohoarc; b=cUCjMX4mdbyzCThrSgby5gIt/lscXBC+WV+RjOyFzdU5YZ0R9Q5rYi+NAxcmTWfCqgwtB/4y6ygiezzBJRDn7gIWwjiQdpOqQlv4jXLa0qp+aKZfUmus1Nr4LCwcX8X5hQKhBAADohh9hg4aCta9szYhlHQhW/FYLEeE3t//4o8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941442; 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=KEFI7uy+xvGQzuX9qXCJxcKIBc3o6R22/Dt7nV8b50A=; b=bUyJ+XN1O//K9prxXCsizUe6NTi7Y84Z1I62NPbssd1z8/BQ+ELYmzyD8v78acngqd5XqjS//W026GC7DaLyMs7L85gV1v7uAyZ56Jjvr1jSPt0sHSwJ0dS+WVf4c84kP8wN3juQbj7pvy7z4NJkA2wuKf1bSpPKsad7d02NZq0= 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 17849414429527.597368004318241; Fri, 24 Jul 2026 18:04:02 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmr-00023a-IP; Fri, 24 Jul 2026 21:02:45 -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 1wnQTS-00072e-FT for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:42 -0400 Received: from mail-ua1-x92f.google.com ([2607:f8b0:4864:20::92f]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTQ-0000sQ-Ro for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:42 -0400 Received: by mail-ua1-x92f.google.com with SMTP id a1e0cc1a2514c-9770e900464so722891241.0 for ; Fri, 24 Jul 2026 17:42:40 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.39 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940160; x=1785544960; 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=KEFI7uy+xvGQzuX9qXCJxcKIBc3o6R22/Dt7nV8b50A=; b=Mzv4OzdldbjZWEano/RtN4FPiLBYAu7N/kMNxaBnmZ6FMj5xuwND24b90V+OxO3OJE bzlWP0zAgO6gRWxqIg+tr8k+RmMolG/ipYyyZnBQ1X8Lw4LMcZda8kRszMPOAkiOAD3j U1xgYBSZqakDe30kiUoVtr/cGDHh+SRpcTMIf1UrsKr/1NHTEedKcf4o9s2cHH/pS0tk WP6ScKlstPZPoXe+KtKgWVySMiKOXpcIHK/STUZSJ9vjTQyLmBm8Ck6buVZt/RAptpS3 cLkwFcdLDU20k61aOCOxd01tfHnaP27xWoIdKs7d9IN9qKd08XPb0XqcHspt3X8G6Zmt +Fww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940160; x=1785544960; 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=KEFI7uy+xvGQzuX9qXCJxcKIBc3o6R22/Dt7nV8b50A=; b=Nhg6bVUqD5nnnxqe2BiEAvspuY9cb1f958QHVrInP9OjS1fgHKUA7wnrupKgkQ4cMW H1KaQhUjX/BllQ1odJZsJ83vBXMZLIkjg3gWfqkmPONAEY82rDD0fqfPwh9Uhd1eCkzt KsNMcapumIAWnEWOLSsEYKSbLx6u/BrbX6dz4pr8CrVKFL8CzZFxSsSN5cWNH6ggkvs9 bOhyyInH6PnvHA/qI97J2AkyLl5rbGNhhQljnj0/mx+CxShuh2WYyAw1zwJfSt5qxLEn 1oWGue0geyRRj4CURAU6IJl9B9PclSgs0WgcpZRSZGUlDzI/RT9xhNrYZwQuKQq6OAHF 8g3g== X-Gm-Message-State: AOJu0Yy74xQMVxA6mL0Auqcoe3LtJNeMeoDfw7EUmNZ+J3l9B4q0JDur wDbntvUYeCw5slmhrQ6RX/KpvqSLAva9o/VdKdwBvBBiSfAusWEn+WpC+EWDy3sM X-Gm-Gg: AR+sD11KB8I5kS4k025+JNapHXWdlp8YKLViqsvqWsBsipQ75dIUxRBat2zmUz9t0Dh je+fxOai68/f59EFxkdcB9hdN+F4zVHrGJ2LyWO1wiprDG+eremtvgiwd+ZJ9ILUVVi0VnnOSrc edWQrxRMeFncpip+CguWoXgpBmWjNqkUap2eyHXhF7vV/0pjfxtI2YkXwC9R05wUmrkCji2xHaj 6A8kWpKer05qkl9H4wSvIXR1SITsVcPSieqBsStohGwjzNi8PMrjUHYpv4Of1J0wsLdefd+FKe5 TX3kfEwDedywwP2oJvEn3BJGNT8eRBhDGmN4mqzscptbq9sjVMJT1ByCP6s6PjkyOwM8hCZEkeo DyyVcACJQ24Ki/WDVn/Y6FzPVQZ8lrqG6jEr21on4bX/S6wQaJu1Hp3kmTLfkBlgI6isctIxNzk MVBIb9dXXQ19hJHq+tk0VEey0KUjkCvgZo X-Received: by 2002:a05:6102:7b0:b0:734:54fa:971d with SMTP id ada2fe7eead31-74f9d69ead8mr1654729137.7.1784940159768; Fri, 24 Jul 2026 17:42:39 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 17/19] hw/net/bcm2838_genet: fix TX ring activation check Date: Fri, 24 Jul 2026 20:42:16 -0400 Message-ID: <20260725004219.66222-18-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::92f; envelope-from=marcelomanzo@gmail.com; helo=mail-ua1-x92f.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941444733158500 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 6f8f4e5b..43583aba 100644 --- a/hw/net/bcm2838_genet.c +++ b/hw/net/bcm2838_genet.c @@ -515,7 +515,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 Sun Jul 26 10:07:05 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=1784941469; cv=none; d=zohomail.com; s=zohoarc; b=maHEx68kSxsGVXH4BqrPZaD2RzdHfohbKP8cTZMwyacTqmn1mbzpqhzcFMHMh+Zcr8LMqMlwONRxw+/x1JrSIM4L62AFS26/xvunH7P2ZJ8ioOzc9VyUneNPB+uRiqiGm3O8w498/CfEo3+Eksp9nXwFSVJK/b9CmuZsaxoQBAs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941469; 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=6XwavS7Vmn+SIE6qd8LrtngwH7IkOtkdttru+6DtMCY=; b=EUkjs/2QfBY6y7tK37TxvY9pwIPX+HL7a7OOlkm5LlgWiKgwyZtcCkNfekxtewqUmv8fDuo5XS0CY8/GTtciyXEQw40NEw5XvlqtcRkgUEfr55Lr0mOTASDF6HW0Dz2T7oLXDTDi1BTbHlxdom4eXd11n3W27dimkI/tMe6BF5o= 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 1784941469865379.9719254882457; Fri, 24 Jul 2026 18:04:29 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmw-00025n-4f; Fri, 24 Jul 2026 21:02:50 -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 1wnQTT-000739-28 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:43 -0400 Received: from mail-ua1-x92d.google.com ([2607:f8b0:4864:20::92d]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTR-0000sl-Gv for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:42 -0400 Received: by mail-ua1-x92d.google.com with SMTP id a1e0cc1a2514c-96935063700so579936241.0 for ; Fri, 24 Jul 2026 17:42:41 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.39 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940160; x=1785544960; 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=6XwavS7Vmn+SIE6qd8LrtngwH7IkOtkdttru+6DtMCY=; b=emu75k5qH+OYjb/bzt3wjDqWuzzKz29Qg/te0L80nofuXPirvJWk5qSLOrovib0M6Z E4DMJStMVOvGoeVNqNlghmjwhO5N8O1UauNkCQUyM9qFe07HURPXftRPJbiAMrd9rRGL /VsjGVpCv85IuB9JB0uwNAG8PhCbad/gcCki34ozAZ+exyyWviQPrVuN/gLBP4RUm8iX +gYKRy7mTDYHPcmzm5CLAUQ+pRIaA02N1yp1CQh/cPGvE/0FNihGcGpMTMfDHEg573PO ytAATyOgX7RpOCOiUamhpzBL7g+cr4+u/akgoL3kWu9pM5CCSlAiQNFipOwOyiRI7J6e BEhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940160; x=1785544960; 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=6XwavS7Vmn+SIE6qd8LrtngwH7IkOtkdttru+6DtMCY=; b=QO8yO57YMIWWsEAFVFtRx5y7TdEop9qefsAI+sOv9MNxygwehAWjvQkyMAakWNmGt7 gnmr774TfSCE1YfV78WlccvsqWPd4vPjgR1I2eDYzFxV6mmz2LgVFrqy0zA7uvSZVuX8 fAdnLBC/ngRT8OUmd/A9+4TyvVQzJlTkSJriThCf5YPO9mDrUr6ba2IIhyuBIadwIMEA zwepPbBq9Jto8Y1iryxfI0mqC8KP88HWZkXlXjwdc/hOylXZW8Ln/ziGg03uzlI0rjIz jXvPBGSaCUrsHJUTrudpqpj95Bva+Zj7kNsc0KXuqE92nZw69rUvvRSJRFFIBF+V/VI+ do+w== X-Gm-Message-State: AOJu0YxIbj9gCLyCbRaiZiuMKONoZqohH2GXB/lkHUJ7yby4MBksQP8o BwEyhxbT4ktYIjTSxTo+5+PveqKcXzL4Q8KHxGsHMH+QaA7RRi/kbFW1Vx80YFcf X-Gm-Gg: AR+sD13pKBPP3zcXBuXXq8oKgx6VxQmrWLd+n6QxIF80+7Wptw8Xm2qXfSV4FSRu7Xl sJIO1jv20fMJFq3dYVwk8Lg0HFNcYTr1ApzId7qgnl5iDUpygSriOvFw/V1OTysAdNuc++nutWZ 4JYZPlXhLTO3/pEg1iiatKeEEK0lVpEt4lqH+rxL6BJiD1ewR5hqhzLim2B7VCsnZ+qQOba9tVh hshnXsKlTHIqZQ0+WbtIvsGgaJ3xlCYL0XOs4NONx3Qx4grjXpGoIZSp58vCI2HQzmSk4bLm4ZH Mr2+59osUE8TwwzziUue0xhPKtii2tdST0V7ooQJjF9JLAQOTJE2eankR8FIqFhBevK0xoqAdc8 BFVGsm8Sh1erU8PAtIIw1ojmvDAMFmKOzWzP0W+HTTBJa164scE1YREwBs0B0UfbWj+D0xq63hH 2AIunLbsvqKdo2cnAlgOm6X7eUPqE4zB/y X-Received: by 2002:a05:6102:54aa:b0:739:5cfb:50f4 with SMTP id ada2fe7eead31-7503e671e86mr806409137.11.1784940160632; Fri, 24 Jul 2026 17:42:40 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo , Pierrick Bouvier Subject: [PATCH 18/19] docs/system/arm/raspi: move PCIe/GENET from missing to implemented Date: Fri, 24 Jul 2026 20:42:17 -0400 Message-ID: <20260725004219.66222-19-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::92d; envelope-from=marcelomanzo@gmail.com; helo=mail-ua1-x92d.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941471430158500 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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/system/arm/raspi.rst b/docs/system/arm/raspi.rst index 44eec3f1..a4f83d0a 100644 --- a/docs/system/arm/raspi.rst +++ b/docs/system/arm/raspi.rst @@ -36,10 +36,10 @@ 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) --=20 2.47.1 From nobody Sun Jul 26 10:07:05 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=1784941392; cv=none; d=zohomail.com; s=zohoarc; b=gAjT+ADUwei6zSp/lf/QQ1ElCnx3Fh0/sPS85daPlG5UtDqLu9i7kkOpiz0Gotu5qVERjy1EGIC3iBtG8g3a0SFWnq1tGtrgTD4P1fITgh0fsU75mUcwBSLNzixvkSm8WerButjKBHP3JEKgL2L2oOk86xm70nNbiB3Wz8KEVcA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784941392; 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=HnQ7gxsV8OdqblNm0oJhx5jgthosF7mosNZcLoe2o7k=; b=dSgvPgyoA/yz0sTXnj88gEoInZgKmeKxGx7Gb7wSK6Uci6sJGeBYxzYNDFXPMGYpj3w+HRMq9RZngI++EaVqEjIscf/gJb4yXoBL5waIJtBJdLvS8dJQt+/fy5Y17nV5z25gFdt5mEEz/5PJwqa3fmBvM4CV1n7/2va8qbP1N5E= 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 1784941392830694.6139133987662; Fri, 24 Jul 2026 18:03:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnQmw-00025y-Iu; Fri, 24 Jul 2026 21:02:50 -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 1wnQTU-00073j-8P for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:45 -0400 Received: from mail-vs1-xe2c.google.com ([2607:f8b0:4864:20::e2c]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnQTS-0000tQ-Nz for qemu-devel@nongnu.org; Fri, 24 Jul 2026 20:42:43 -0400 Received: by mail-vs1-xe2c.google.com with SMTP id ada2fe7eead31-73a8ac9cd52so688681137.0 for ; Fri, 24 Jul 2026 17:42:42 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774f12690sm930591241.12.2026.07.24.17.42.40 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 17:42:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784940162; x=1785544962; 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=HnQ7gxsV8OdqblNm0oJhx5jgthosF7mosNZcLoe2o7k=; b=LAVKsSlTyqSNiXURUPMXXvKMonZ+8KENuAyu3ACHS8fymxD2xPboBzVTLfYZnz7pfq zl0qOcPQ45I5OxWfhI+heqSFyiqliWTsISSeAULtsCsLKQZtjK5JWcyTIDg9CejZYr0b EEM38bgtEsmKKP60A2WcfFb9tTDZCDqkhe/NtXo0vnhk7C5gWTg2LCUjzHiHw5PyYPRV Ik2gz08xlLneEi1Ziqx9R2DJpSLGTT8sG8bFT3lBht1iYGc5nJsZsf1+zYWvxFvKndOK 6fBn3+9b7MG1uoi9HotUmpeVvRR3AsEeDVKNnxvXvq/DO2l7KM/GocfHK9Rtwt4oYp92 F8Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784940162; x=1785544962; 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=HnQ7gxsV8OdqblNm0oJhx5jgthosF7mosNZcLoe2o7k=; b=aINrUM8wgdq5x0eInKHA5687Z6orjR2KRq16OfuCg99KtxJH6W0VAOZUdOODZ+i5p5 8QUZOxZLqrgA98sy1tj9LIooJ1w00S4R/QNj8y+nxfXJAiXodKMYNYtBgh3LOJE/LfjD /6nYCE7oV8fPO28ZSHDK2edwx3MO44JAejAxbaSfUxgOmgFw716EaAeVXn67m3pHX7Dz +j5WKL7huI/QoPssXfU6swE1/WoLk/8XzUCdKUB52YCpRikPR/Qm50Kz4hpG3HiCS7Nu H73jbA/Szsjlhf+nPIfd9shKQtiog+gKaN7mSQOHGhPmAr/sZOmLW9Tl3hnDWXp14omS OqPg== X-Gm-Message-State: AOJu0YxIfOy5EibkGyWWb0nWUHYBuVOT6za6xhdeYU18vbX5WuM2yHhh 495/NWU5AUHIrUsoVCnprYqrfcEefglQGWsYX4PIC4ziICObOrsA1k+51HztImiY X-Gm-Gg: AR+sD11JfEXGChNe1k28z19Yra2McMDQmjq/F0ThvvPgo3sLzuBb+SwA7/AT0sBJuqM Ue8oSrbGK3avJ94+cMKWwxvM5h2xq+jPI5S59mBWoxTx+IZ4VoeuYCgCcIrz/50uj33I4HWZ/x9 eNq77WU+15Cd47dteoKv9t1zUbDbuHyHQOC1E/bTlZqwhlRPLO5d6T95UYfVIrrtOoZMbsjMA4q s42TgmXDPyTWWnXwobxIKQ+TaRCv4AWm/AjNk3PV5qJYMa7Iu+aqyuhYevY3qyd5rcUcI5R5tbc Eb6J9+zfdlQY9/nPf3nxBEERwVnDs1VzWrn7ufb4muoiRufD3JbaGsgNa9BjNwK6rGwk3AmcUgX LTkVa4rMl4hDEw7NX/U1bZ506LeU/Sk5tPOSkRlxPJHLXxtwMuyH8Dr+dHzNhD2hfIpn0EbYweI mjf0niqTwrAzN0adgepBdTNlvrSJR6BHIs X-Received: by 2002:a05:6102:a210:10b0:6cd:b43f:72fd with SMTP id ada2fe7eead31-74f9fc68fb5mr1307052137.22.1784940161607; Fri, 24 Jul 2026 17:42:41 -0700 (PDT) From: Marcelo Manzo To: qemu-devel@nongnu.org Cc: qemu-arm@nongnu.org, Peter Maydell , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Jason Wang , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 19/19] tests/functional/aarch64: add raspi4b GENET networking test Date: Fri, 24 Jul 2026 20:42:18 -0400 Message-ID: <20260725004219.66222-20-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725004219.66222-1-marcelomanzo@gmail.com> References: <20260725004219.66222-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::e2c; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe2c.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-Mailman-Approved-At: Fri, 24 Jul 2026 21:02:41 -0400 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: 1784941395170158500 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 7a4302b0..0e254a20 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