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=1784942865; cv=none; d=zohomail.com; s=zohoarc; b=HyATIQwwFM0CsPoq1g/NbOKi4P8omohyI3X+TJpGRD2DRwqtyvX5KI/Mpy1IboXRWwryLbK14ZUfswKoghbQz+xhzsVQ273w8HQh572KBqGq6vcSKWmQ+fN2IPwxkbrtJpyDre0qEvQLNCWI1/0uuRvooaxh8Lvjt9dlAPfbC7Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784942865; 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=Cfq2dxV/4zlgar+Tp7J8Af9zywkENE9VR2/NjRdloAo=; b=JHOO/doTBzbAe3IwxGWsPahO2vJdIrBZGZFTIjaXkaAiutNR3tzftwVXqyDYw80Bv4RSDxA4flJ6L/EURwZjzuKinaO3tt1sN7F3PzMA5OOxlZ7DssTxRA04iqShB7IzayLVYOFYhSNstsj2xCkid77pm+/Zh+hkD2uHsTsApL4= 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 1784942865113617.1859040297531; Fri, 24 Jul 2026 18:27:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnRA5-0004yN-D5; Fri, 24 Jul 2026 21:26: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 1wnRA3-0004xp-NY for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:43 -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 1wnRA1-0006FA-8P for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:43 -0400 Received: by mail-vs1-xe35.google.com with SMTP id ada2fe7eead31-736eea06c3eso391574137.0 for ; Fri, 24 Jul 2026 18:26:40 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774c388d7sm1092856241.1.2026.07.24.18.26.38 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 18:26:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784942800; x=1785547600; 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=Cfq2dxV/4zlgar+Tp7J8Af9zywkENE9VR2/NjRdloAo=; b=FIO8kJrePSCag+1CXvkv9huXdSpxTnjBli+xmN9oiA2lD036LY5gRv5y5oCkFvuMt0 58ePp07DLpXMPZJmwz3guPONQe7ohaMpC6jjA41ySzAB6AeMiM0IAZtU7oAwjcMkM7bT ASUspg7RwpGNXLC5a0HC0hR4b9sjv0xuuUB021bn8bXeTYkuH2C8c7ey2fa9NCq+K7Qu gRvn6Ybf0cdJcZqS0ELufEqQNnCSZSluwVKpOuwCU7axD4wJG9Niowsp4YYqCLFCJBmC E0XgFL5qWiby7Mrjg+qmf9wfetYB2lSth+hc6B+89Z0JHjYyUTYos/2Lhm1AUxUP8WBJ H41w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784942800; x=1785547600; 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=Cfq2dxV/4zlgar+Tp7J8Af9zywkENE9VR2/NjRdloAo=; b=cxLpDw9nYMerjTgoId5bpz7iJ6agLj5kqw5+GrE+4oJjNvgZy6Fy1AT24ow3vy1vHD /LniEN9MFpJRWRKMWOiClKAzEEcTxy+tquQkDrj4elVoiJq4YQz0/X8K2zuXrLWUHh58 n9TxG/bURQ6nj15vkp7TFryyYT7HPLriGLpBsCVp5fy6PKdsCyJiVcG2wqK0ZSDgKSjM w4HgbqrZHj9pgz0zOrMqqWDOM3T6mCMjKf1/rdht+SqHvOTzprkSVvWoCmav5j82Noae Xgf3anSkklDJ7qirUOwlL4Zh8uQJqMmiuvwcdhDIfKLjrI4u0as7Yndmeol4/bZJ8t9y vSGg== X-Gm-Message-State: AOJu0YykdTy9IMj8eAOgevoDfEz0L+GXFGWPLmvt9dPm/tIyx6lAiJw5 ysSEduBvbKO1OZHAspe6FwDHbm6lS5++PpQjB0ViFOOcH1UeVPhEIjupfOtBqqpE X-Gm-Gg: AR+sD13GaKbJUZZLWPJA71dPjer2dQlB3tvzhsraexkty2nYE5ag7gQsyHeekl9S+Xz LHvbENZtliJ+iqIyd5gvNlw2/oDT112ltvf4dLniVTcEXH7bXtGPLKiVQSqZxOSf/iJhkApe9U/ AUzR4wu26197wd/O0MZjH1EhKt9fCduuQochgvZm0Otlf7HMlVTiKRkihJWWDaB4iGBfDl+qsLZ 1zoK72tiK5IL3FUSagN7HuyXXicSOg5cBHcii4qFkY+rmtWxg3+EOnoDyCLQgQCeE2cn5t+Tc6W pl8cUVocjGHoQDLulZMe48Y1tFsjOgK8B1olRZsbHW/M/Q8xRLwS4Hq/tDiq3kU+LsZ1OyzyPsD RwL+cCz27jHwUCx3zaSGo061vPdoEQ32/QWl7Fz21E1Xz3YECpqxRqTH/W9ATLZ88WW+o8B3Bau 1qhVwvBxDYgqaakrxC28dMHPcjRGEMtPSk X-Received: by 2002:a05:6102:6b0a:b0:737:d207:5608 with SMTP id ada2fe7eead31-750407c2d9cmr697105137.21.1784942800141; Fri, 24 Jul 2026 18:26: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?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 1/5] hw/misc/bcm2838_rng200: add BCM2838 RNG200 Date: Fri, 24 Jul 2026 21:26:31 -0400 Message-ID: <20260725012635.4925-2-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725012635.4925-1-marcelomanzo@gmail.com> References: <20260725012635.4925-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-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: 1784942866276158500 Content-Type: text/plain; charset="utf-8" From: Sergey Kambalin Add the BCM2838 (BCM2711/Raspberry Pi 4B) hardware random number generator: register model (control, FIFO data/count, int mask/status), a Fifo8-backed entropy buffer refilled from a qemu_rng backend on a ptimer tick, and interrupt generation once the FIFO crosses its configured threshold. Part of Sergey Kambalin's original Raspberry Pi 4B series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Ported to current master by Marcelo Manzo: header paths moved under hw/core/, class_init()'s const void *data, the Resettable phases API, Property[] losing its DEFINE_PROP_END_OF_LIST() sentinel, and fifo8_pop_buf() gaining a caller-supplied destination buffer instead of returning an internal pointer (adapted bcm2838_rng200_read_fifo_data() to the new copying API, which QEMU's own fifo8.h now recommends over the old fifo8_pop_bufptr() this code originally used). No functional change otherwise. Boot-tested: guest probes it ("iproc-rng200 fe104000.rng: hwrng registered"), /dev/hwrng exists, and reading it returns real random bytes. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/misc/bcm2838_rng200.c | 406 +++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + hw/misc/trace-events | 10 + include/hw/misc/bcm2838_rng200.h | 42 ++++ 4 files changed, 459 insertions(+) create mode 100644 hw/misc/bcm2838_rng200.c create mode 100644 include/hw/misc/bcm2838_rng200.h diff --git a/hw/misc/bcm2838_rng200.c b/hw/misc/bcm2838_rng200.c new file mode 100644 index 00000000..2d12d45e --- /dev/null +++ b/hw/misc/bcm2838_rng200.c @@ -0,0 +1,406 @@ +/* + * BCM2838 Random Number Generator emulation + * + * Copyright (C) 2022 Sergey Pushkarev + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qom/object_interfaces.h" +#include "qapi/error.h" +#include "hw/core/qdev-properties.h" +#include "hw/misc/bcm2838_rng200.h" +#include "hw/core/registerfields.h" +#include "hw/core/resettable.h" +#include "migration/vmstate.h" +#include "trace.h" + +/* RNG200 registers */ +REG32(RNG_CTRL, 0x00) + FIELD(RNG_CTRL, RBG_ENABLE, 0 , 1) + FIELD(RNG_CTRL, RSVD, 1 , 12) + FIELD(RNG_CTRL, DIV, 13 , 8) + +REG32(RNG_SOFT_RESET, 0x04) +REG32(RBG_SOFT_RESET, 0x08) +REG32(RNG_TOTAL_BIT_COUNT, 0x0C) +REG32(RNG_TOTAL_BIT_COUNT_THRESHOLD, 0x10) + +REG32(RNG_INT_STATUS, 0x18) + FIELD(RNG_INT_STATUS, TOTAL_BITS_COUNT_IRQ, 0, 1) + FIELD(RNG_INT_STATUS, RSVD0, 1, 4) + FIELD(RNG_INT_STATUS, NIST_FAIL_IRQ, 5, 1) + FIELD(RNG_INT_STATUS, RSVD1, 6, 11) + FIELD(RNG_INT_STATUS, STARTUP_TRANSITIONS_MET_IRQ, 17, 1) + FIELD(RNG_INT_STATUS, RSVD2, 18, 13) + FIELD(RNG_INT_STATUS, MASTER_FAIL_LOCKOUT_IRQ, 30, 1) + +REG32(RNG_INT_ENABLE, 0x1C) + FIELD(RNG_INT_ENABLE, TOTAL_BITS_COUNT_IRQ, 0, 1) + FIELD(RNG_INT_ENABLE, RSVD0, 1, 4) + FIELD(RNG_INT_ENABLE, NIST_FAIL_IRQ, 5, 1) + FIELD(RNG_INT_ENABLE, RSVD1, 6, 11) + FIELD(RNG_INT_ENABLE, STARTUP_TRANSITIONS_MET_IRQ, 17, 1) + FIELD(RNG_INT_ENABLE, RSVD2, 18, 13) + FIELD(RNG_INT_ENABLE, MASTER_FAIL_LOCKOUT_IRQ, 30, 1) + +REG32(RNG_FIFO_DATA, 0x20) + +REG32(RNG_FIFO_COUNT, 0x24) + FIELD(RNG_FIFO_COUNT, COUNT, 0, 8) + FIELD(RNG_FIFO_COUNT, THRESHOLD, 8, 8) + + +#define RNG_WARM_UP_PERIOD_ELAPSED 17 + +#define SOFT_RESET 1 +#define IRQ_PENDING 1 + +#define BCM2838_RNG200_PTIMER_POLICY (PTIMER_POLICY_CONTINUOUS_TRI= GGER) + +static const VMStateDescription vmstate_bcm2838_rng200 =3D { + .name =3D "bcm2838_rng200", + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (VMStateField[]) { + VMSTATE_UINT32(rng_fifo_cap, BCM2838Rng200State), + VMSTATE_ARRAY(regs, BCM2838Rng200State, N_BCM2838_RNG200_REGS, 0, + vmstate_info_uint32, uint32_t), + + VMSTATE_END_OF_LIST() + } +}; + +static bool is_rbg_enabled(BCM2838Rng200State *s) +{ + return FIELD_EX32(s->regs[R_RNG_CTRL], RNG_CTRL, RBG_ENABLE); +} + +static void increment_bit_counter_by(BCM2838Rng200State *s, uint32_t inc_v= al) +{ + s->regs[R_RNG_TOTAL_BIT_COUNT] +=3D inc_val; +} + +static void bcm2838_rng200_update_irq(BCM2838Rng200State *s) +{ + qemu_set_irq(s->irq, + !!(s->regs[R_RNG_INT_ENABLE] & s->regs[R_RNG_INT_STATUS])); +} + +static void bcm2838_rng200_update_rbg_period(void *opaque, ClockEvent even= t) +{ + BCM2838Rng200State *s =3D (BCM2838Rng200State *)opaque; + + ptimer_transaction_begin(s->ptimer); + ptimer_set_period_from_clock(s->ptimer, s->clock, s->rng_fifo_cap * 8); + ptimer_transaction_commit(s->ptimer); +} + +static void bcm2838_rng200_update_fifo(void *opaque, const void *buf, + size_t size) +{ + BCM2838Rng200State *s =3D (BCM2838Rng200State *)opaque; + Fifo8 *fifo =3D &s->fifo; + size_t num =3D MIN(size, fifo8_num_free(fifo)); + uint32_t num_bits =3D num * 8; + uint32_t bit_count =3D 0; + uint32_t bit_count_thld =3D 0; + uint32_t fifo_thld =3D 0; + + bit_count =3D s->regs[R_RNG_TOTAL_BIT_COUNT]; + bit_count_thld =3D s->regs[R_RNG_TOTAL_BIT_COUNT_THRESHOLD]; + + if (bit_count + num_bits < bit_count_thld) { + increment_bit_counter_by(s, num_bits); + + fifo8_push_all(fifo, buf, num); + + fifo_thld =3D FIELD_EX32(s->regs[R_RNG_FIFO_COUNT], + RNG_FIFO_COUNT, THRESHOLD); + + if (fifo8_num_used(fifo) > fifo_thld) { + s->regs[R_RNG_INT_STATUS] =3D FIELD_DP32(s->regs[R_RNG_INT_STA= TUS], + RNG_INT_STATUS, + TOTAL_BITS_COUNT_IRQ, = 1); + } + } + + s->regs[R_RNG_FIFO_COUNT] =3D FIELD_DP32(s->regs[R_RNG_FIFO_COUNT], + RNG_FIFO_COUNT, + COUNT, + fifo8_num_used(fifo) >> 2); + bcm2838_rng200_update_irq(s); + trace_bcm2838_rng200_update_fifo(num, fifo8_num_used(fifo)); +} + +static void bcm2838_rng200_fill_fifo(BCM2838Rng200State *s) +{ + rng_backend_request_entropy(s->rng, fifo8_num_free(&s->fifo), + bcm2838_rng200_update_fifo, s); +} + +static void bcm2838_rng200_disable_rbg(void) +{ + trace_bcm2838_rng200_disable_rbg(); +} + +static void bcm2838_rng200_enable_rbg(BCM2838Rng200State *s) +{ + s->regs[R_RNG_TOTAL_BIT_COUNT] =3D RNG_WARM_UP_PERIOD_ELAPSED; + + bcm2838_rng200_fill_fifo(s); + + trace_bcm2838_rng200_enable_rbg(); +} + +static void bcm2838_rng200_rng_reset(BCM2838Rng200State *s) +{ + memset(s->regs, 0, sizeof(s->regs)); + s->regs[R_RNG_INT_STATUS] =3D FIELD_DP32(s->regs[R_RNG_INT_STATUS], + RNG_INT_STATUS, + STARTUP_TRANSITIONS_MET_IRQ, + IRQ_PENDING); + fifo8_reset(&s->fifo); + + trace_bcm2838_rng200_rng_soft_reset(); +} + +static void bcm2838_rng200_rbg_reset(BCM2838Rng200State *s) +{ + trace_bcm2838_rng200_rbg_soft_reset(); +} + +static uint32_t bcm2838_rng200_read_fifo_data(BCM2838Rng200State *s) +{ + Fifo8 *fifo =3D &s->fifo; + uint32_t to_read =3D MIN(fifo8_num_used(fifo), 4); + uint8_t byte_buf[4] =3D {}; + uint8_t *p =3D byte_buf; + uint32_t ret =3D 0; + uint32_t num; + + while (to_read) { + num =3D fifo8_pop_buf(fifo, p, to_read); + p +=3D num; + to_read -=3D num; + } + ret =3D ldl_le_p(byte_buf); + + s->regs[R_RNG_FIFO_COUNT] =3D FIELD_DP32(s->regs[R_RNG_FIFO_COUNT], + RNG_FIFO_COUNT, + COUNT, + fifo8_num_used(fifo) >> 2); + + bcm2838_rng200_fill_fifo(s); + + return ret; +} + +static void bcm2838_rng200_ctrl_write(BCM2838Rng200State *s, uint32_t valu= e) +{ + bool currently_enabled =3D is_rbg_enabled(s); + bool enable_requested =3D FIELD_EX32(value, RNG_CTRL, RBG_ENABLE); + + s->regs[R_RNG_CTRL] =3D value; + + if (!currently_enabled && enable_requested) { + bcm2838_rng200_enable_rbg(s); + } else if (currently_enabled && !enable_requested) { + bcm2838_rng200_disable_rbg(); + } +} + +static uint64_t bcm2838_rng200_read(void *opaque, hwaddr offset, + unsigned size) +{ + BCM2838Rng200State *s =3D (BCM2838Rng200State *)opaque; + uint32_t res =3D 0; + + switch (offset) { + case A_RNG_CTRL: + res =3D s->regs[R_RNG_CTRL]; + break; + case A_RNG_SOFT_RESET: + case A_RBG_SOFT_RESET: + break; + case A_RNG_INT_STATUS: + res =3D s->regs[R_RNG_INT_STATUS]; + break; + case A_RNG_INT_ENABLE: + res =3D s->regs[R_RNG_INT_ENABLE]; + break; + case A_RNG_FIFO_DATA: + res =3D bcm2838_rng200_read_fifo_data(s); + break; + case A_RNG_FIFO_COUNT: + res =3D s->regs[R_RNG_FIFO_COUNT]; + break; + case A_RNG_TOTAL_BIT_COUNT: + res =3D s->regs[R_RNG_TOTAL_BIT_COUNT]; + break; + case A_RNG_TOTAL_BIT_COUNT_THRESHOLD: + res =3D s->regs[R_RNG_TOTAL_BIT_COUNT_THRESHOLD]; + break; + default: + qemu_log_mask( + LOG_GUEST_ERROR, + "bcm2838_rng200_read: Bad offset 0x%" HWADDR_PRIx "\n", + offset + ); + res =3D 0; + break; + } + + trace_bcm2838_rng200_read(offset, size, res); + return res; +} + +static void bcm2838_rng200_write(void *opaque, hwaddr offset, + uint64_t value, unsigned size) +{ + BCM2838Rng200State *s =3D (BCM2838Rng200State *)opaque; + + trace_bcm2838_rng200_write(offset, value, size); + + switch (offset) { + case A_RNG_CTRL: + bcm2838_rng200_ctrl_write(s, value); + break; + case A_RNG_SOFT_RESET: + if (value & SOFT_RESET) { + bcm2838_rng200_rng_reset(s); + } + break; + case A_RBG_SOFT_RESET: + if (value & SOFT_RESET) { + bcm2838_rng200_rbg_reset(s); + } + break; + case A_RNG_INT_STATUS: + s->regs[R_RNG_INT_STATUS] &=3D ~value; + bcm2838_rng200_update_irq(s); + break; + case A_RNG_INT_ENABLE: + s->regs[R_RNG_INT_ENABLE] =3D value; + bcm2838_rng200_update_irq(s); + break; + case A_RNG_FIFO_COUNT: + s->regs[R_RNG_FIFO_COUNT] =3D value; + break; + case A_RNG_TOTAL_BIT_COUNT_THRESHOLD: + s->regs[R_RNG_TOTAL_BIT_COUNT_THRESHOLD] =3D value; + s->regs[R_RNG_TOTAL_BIT_COUNT] =3D value + 1; + break; + default: + qemu_log_mask( + LOG_GUEST_ERROR, + "bcm2838_rng200_write: Bad offset 0x%" HWADDR_PRIx "\n", + offset + ); + break; + } +} + +static const MemoryRegionOps bcm2838_rng200_ops =3D { + .read =3D bcm2838_rng200_read, + .write =3D bcm2838_rng200_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .impl =3D { + .max_access_size =3D 4, + .min_access_size =3D 4, + }, + .valid =3D { + .max_access_size =3D 4, + .min_access_size =3D 4 + }, +}; + +static void bcm2838_rng200_realize(DeviceState *dev, Error **errp) +{ + BCM2838Rng200State *s =3D BCM2838_RNG200(dev); + + if (s->rng =3D=3D NULL) { + Object *default_backend =3D object_new(TYPE_RNG_BUILTIN); + + if (!user_creatable_complete(USER_CREATABLE(default_backend), + errp)) { + object_unref(default_backend); + error_setg(errp, "Failed to create user creatable RNG backend"= ); + return; + } + + object_property_add_child(OBJECT(dev), "default-backend", + default_backend); + object_unref(default_backend); + + object_property_set_link(OBJECT(dev), "rng", default_backend, + errp); + } + + fifo8_create(&s->fifo, s->rng_fifo_cap); + sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq); +} + +static void bcm2838_rng200_init(Object *obj) +{ + BCM2838Rng200State *s =3D BCM2838_RNG200(obj); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(obj); + + s->rng_fifo_cap =3D 128; + + s->clock =3D qdev_init_clock_in(DEVICE(s), "rbg-clock", + bcm2838_rng200_update_rbg_period, s, + ClockPreUpdate); + if (s->clock =3D=3D NULL) { + error_setg(&error_fatal, "Failed to init RBG clock"); + return; + } + + memory_region_init_io(&s->iomem, obj, &bcm2838_rng200_ops, s, + TYPE_BCM2838_RNG200, 0x28); + sysbus_init_mmio(sbd, &s->iomem); +} + +static void bcm2838_rng200_reset(Object *obj, ResetType type) +{ + BCM2838Rng200State *s =3D BCM2838_RNG200(obj); + + bcm2838_rng200_rbg_reset(s); + bcm2838_rng200_rng_reset(s); +} + +static const Property bcm2838_rng200_properties[] =3D { + DEFINE_PROP_LINK("rng", BCM2838Rng200State, rng, + TYPE_RNG_BACKEND, RngBackend *), +}; + +static void bcm2838_rng200_class_init(ObjectClass *klass, const void *data) +{ + static ResettablePhases unused_parent_phases; + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + + dc->realize =3D bcm2838_rng200_realize; + resettable_class_set_parent_phases(rc, NULL, bcm2838_rng200_reset, NUL= L, + &unused_parent_phases); + dc->vmsd =3D &vmstate_bcm2838_rng200; + + device_class_set_props(dc, bcm2838_rng200_properties); +} + +static const TypeInfo bcm2838_rng200_info =3D { + .name =3D TYPE_BCM2838_RNG200, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(BCM2838Rng200State), + .class_init =3D bcm2838_rng200_class_init, + .instance_init =3D bcm2838_rng200_init, +}; + +static void bcm2838_rng200_register_types(void) +{ + type_register_static(&bcm2838_rng200_info); +} + +type_init(bcm2838_rng200_register_types) diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 23265f60..cf73ab4c 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -94,6 +94,7 @@ system_ss.add(when: 'CONFIG_RASPI', if_true: files( 'bcm2835_thermal.c', 'bcm2835_cprman.c', 'bcm2835_powermgt.c', + 'bcm2838_rng200.c', )) system_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c')) system_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c')) diff --git a/hw/misc/trace-events b/hw/misc/trace-events index c9a868b3..90e178ed 100644 --- a/hw/misc/trace-events +++ b/hw/misc/trace-events @@ -442,3 +442,13 @@ iommu_testdev_dma_read(uint64_t gva, uint32_t len) "gv= a=3D0x%" PRIx64 " len=3D%u" iommu_testdev_dma_verify(uint32_t expected, uint32_t actual) "expected=3D0= x%x actual=3D0x%x" iommu_testdev_dma_result(uint32_t result) "DMA completed result=3D0x%x" iommu_testdev_dma_armed(bool armed) "armed=3D%d" + +# bcm2838_rng200.c +bcm2838_rng200_rng_soft_reset(void) "RNumG soft reset" +bcm2838_rng200_rbg_soft_reset(void) "RBitG soft reset" +bcm2838_rng200_enable_rbg(void) "RBitG enabled" +bcm2838_rng200_disable_rbg(void) "RBitG disabled" +bcm2838_rng200_update_fifo(uint32_t len, uint32_t fifo_len) "len %u, fi= fo_len %u" +bcm2838_rng200_fifo_full(void) "RNumG FIFO full" +bcm2838_rng200_write(uint64_t addr, uint64_t value, unsigned size) "addr: = 0x%"PRIx64" value: 0x%016" PRIx64 " size: %u" +bcm2838_rng200_read(uint64_t addr, unsigned size, uint64_t value) "addr: 0= x%"PRIx64" size: %u value: 0x%016" PRIx64 diff --git a/include/hw/misc/bcm2838_rng200.h b/include/hw/misc/bcm2838_rng= 200.h new file mode 100644 index 00000000..05bc87fa --- /dev/null +++ b/include/hw/misc/bcm2838_rng200.h @@ -0,0 +1,42 @@ +/* + * BCM2838 Random Number Generator emulation + * + * Copyright (C) 2022 Sergey Pushkarev + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef BCM2838_RNG200_H +#define BCM2838_RNG200_H + +#include +#include "qom/object.h" +#include "qemu/fifo8.h" +#include "system/rng.h" +#include "hw/core/sysbus.h" +#include "hw/core/ptimer.h" +#include "hw/core/qdev-clock.h" +#include "hw/core/irq.h" + +#define TYPE_BCM2838_RNG200 "bcm2838-rng200" +OBJECT_DECLARE_SIMPLE_TYPE(BCM2838Rng200State, BCM2838_RNG200) + +#define N_BCM2838_RNG200_REGS 10 + +struct BCM2838Rng200State { + SysBusDevice busdev; + MemoryRegion iomem; + + ptimer_state *ptimer; + RngBackend *rng; + Clock *clock; + + uint32_t rng_fifo_cap; + Fifo8 fifo; + + qemu_irq irq; + + uint32_t regs[N_BCM2838_RNG200_REGS]; +}; + +#endif /* BCM2838_RNG200_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=1784942878; cv=none; d=zohomail.com; s=zohoarc; b=Ydn2QtfKnLLSZD/QIBkMc7GDJ4mhr+SPpY/wfgpYmcjTHepGnqGqFoOHG6ofCQ1v46KamBPpIs5VrnmHemaz9C+a1uk31+Tk9BYkqyCq5T+5mstpgElj5Ie72Bh3636ILpuzhC+J3n/bxxws71+ltU0jtdteBc7cRR+FKXOMu5o= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784942878; 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=+yMeDOMb0pwkug1K7IkktsL81hktue6I1jYBC2y5MTY=; b=GctJ1rSTEK1bAE5ghkDpQvaoEhUoAr4Wiflr41c1LAO+Gv4v6fNFXYY0Pzeyg01lw+DjEoB9Dh76KBCFOBMOP7rHexEKZCMJRfH5MG9ZwLKlNbAA5hFpCGGgt7RuZS0tPo4j7vZS12TuGZlY+RpbNjZgeUneUnl9oja42YaDcr0= 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 1784942878632115.07348281261602; Fri, 24 Jul 2026 18:27:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnRA6-0004yw-9T; Fri, 24 Jul 2026 21:26: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 1wnRA5-0004y8-1o for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:45 -0400 Received: from mail-ua1-x932.google.com ([2607:f8b0:4864:20::932]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnRA2-0006FU-UV for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:44 -0400 Received: by mail-ua1-x932.google.com with SMTP id a1e0cc1a2514c-96935063700so591126241.0 for ; Fri, 24 Jul 2026 18:26:42 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774c388d7sm1092856241.1.2026.07.24.18.26.40 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 18:26:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784942802; x=1785547602; 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=+yMeDOMb0pwkug1K7IkktsL81hktue6I1jYBC2y5MTY=; b=a8HbTCzk9cmMAng0eztf/glTgkVBj79Gwp2J3pv9Td+juPEfwqOfjtBCYtrvF1d/gi u/DtuwH+PtpnMpjg/AuUXziET17N/jWAiPQcE11hYI/bDtt4YC/8OFt+MrPNzc8NgK/N nXdi4M0YpFuzFhyX3ZiXCPN2goldlQbR3EAp9SeMkRxp6tJWF04tdVDloANCYCgwU18I 3a4a6s/jqFDtT4cZU9DrOUG7rBcLTTGFH2hsndibnUt1zLBYMh0bj2vAmf4Tz4fqWI3i SVDS6+SfFURB3NTE2ejoCD03n0wG3yQLjvmx5tWVmsKWHcskSdzSxESMfEgPKClWn4OM kVZg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784942802; x=1785547602; 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=+yMeDOMb0pwkug1K7IkktsL81hktue6I1jYBC2y5MTY=; b=JU7N8XgJ4XNyGvL4tknca9DLPQC7746QfHlwxG1xydUPt5lLcddgsopB1lpjA+MMIs EaAeBx0CdpCNBYrt9vSMCCy62ojBLSUwi806he3K71P5YWUX0hJZorN266VIMmE58nD4 jJQ0+QlPzLGWG8aPWz1PZuTxy77ARA/yjyaukD5r43znALTWqv65ElGKSH590UeNmIiY QrClMkSi2LZRUsbH+LhMDH+TIBBf8fUF6G7+faWoaD0qpyAFS1E7hamEaX1isUHvds9O ZF0d7uaCTNj50fmOnc2RPRolUtvd8MII2EKIONXx5PTJ4DLQ1qm+hiHTjIgqBW9v7156 OeMw== X-Gm-Message-State: AOJu0YyCDEWL9pj4qHPFkAfBj0vakMCJCo6jvtWAFjBVINr4f5TE/P0z JwgQPb8yX1q8StoShNEXV+Pv8pANwQl1TeXrx3vLCUG/Q+ravq+vDKtc+IDqPt33 X-Gm-Gg: AR+sD10TJy28NTPNMlyUmeG+/C+BIk1HjebOF9iecdcrKMGSLTyn3Tj8e8oo2NzISBK 6Wb663i6bjZpXueNq7D2o8SzhfcgfdqdrywV61EzGqriJqpCKYwvE/yCvtSfM61n1JHNtd8W+jo XM1GQ0KXM3wafdaC9JJaFB9E5WdreU1dEWAJpGpGmc6aoXl/sx3P3LjZO+62bhWs+hd5jCv4/lG Z7R1ueNhT7dLiJqp2IlTG+xEh36fQwG1u2VtehLNyA2ZuOA5jNFTTT8aoQyQEN4WS6n1qLXbJuw 6RyBSY62DWkGKhe1qDa08uRu2069P/XFdmvRbkRB2UlH4tbLzCUdKHmsDzmEHG3MREqPQ9udD9W J99g23k7Se/AcG/1ptQiZXtBrcV88ZaxTC/OBa1BEIt7IoVo3ELN3c3D7UzJ5Q0Mh+sTheaUCn2 tFVaCcAJh1bQm6ZcSTl7V7qeaXgNMQ2P+QD/fVbO5Lbjg= X-Received: by 2002:a05:6102:f86:b0:6c5:d55d:c093 with SMTP id ada2fe7eead31-7503e66dbe3mr802868137.8.1784942801771; Fri, 24 Jul 2026 18:26: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?= , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 2/5] hw/arm/bcm2838: enable BCM2838 RNG200 Date: Fri, 24 Jul 2026 21:26:32 -0400 Message-ID: <20260725012635.4925-3-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725012635.4925-1-marcelomanzo@gmail.com> References: <20260725012635.4925-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::932; envelope-from=marcelomanzo@gmail.com; helo=mail-ua1-x932.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1784942880861158500 Content-Type: text/plain; charset="utf-8" Wire the BCM2838 RNG200 device (added in the previous patch) into the SoC: instantiate it in the peripherals block, map its register region at the real BCM2711 physical address, and connect its interrupt through both the GIC and the legacy GPU interrupt controller path (matching how the device's own realize() wires it, mirroring the pattern used for the older BCM2835 RNG on raspi0-3). Also stop raspi4b from masking out the "brcm,bcm2711-rng200" device-tree node, now that the controller it describes is actually implemented. Adapted from patch 16/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 | 4 ++++ hw/arm/bcm2838_peripherals.c | 17 +++++++++++++++++ hw/arm/raspi4b.c | 1 - include/hw/arm/bcm2838_peripherals.h | 2 ++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/hw/arm/bcm2838.c b/hw/arm/bcm2838.c index f47b96c3..9d96dc11 100644 --- a/hw/arm/bcm2838.c +++ b/hw/arm/bcm2838.c @@ -209,6 +209,10 @@ static void bcm2838_realize(DeviceState *dev, Error **= errp) sysbus_connect_irq(SYS_BUS_DEVICE(&ps_base->dwc2), 0, qdev_get_gpio_in(gicdev, GIC_SPI_INTERRUPT_DWC2)); =20 + /* Connect RNG200 to the interrupt controller */ + sysbus_connect_irq(SYS_BUS_DEVICE(&ps->rng200), 0, + qdev_get_gpio_in(gicdev, GIC_SPI_INTERRUPT_RNG200)); + /* Connect DMA 0-6 to the interrupt controller */ for (int n =3D GIC_SPI_INTERRUPT_DMA_0; n <=3D GIC_SPI_INTERRUPT_DMA_6= ; n++) { sysbus_connect_irq(SYS_BUS_DEVICE(&ps_base->dma), diff --git a/hw/arm/bcm2838_peripherals.c b/hw/arm/bcm2838_peripherals.c index de49f48b..7c202b00 100644 --- a/hw/arm/bcm2838_peripherals.c +++ b/hw/arm/bcm2838_peripherals.c @@ -40,6 +40,9 @@ static void bcm2838_peripherals_init(Object *obj) /* Extended Mass Media Controller 2 */ object_initialize_child(obj, "emmc2", &s->emmc2, TYPE_SYSBUS_SDHCI); =20 + /* Random Number Generator */ + object_initialize_child(obj, "rng200", &s->rng200, TYPE_BCM2838_RNG200= ); + /* PCIe Host Bridge */ object_initialize_child(obj, "pcie-host", &s->pcie_host, TYPE_BCM2838_PCIE_HOST); @@ -82,6 +85,8 @@ static void bcm2838_peripherals_realize(DeviceState *dev,= Error **errp) BCMSocPeripheralBaseState *s_base =3D BCM_SOC_PERIPHERALS_BASE(dev); MemoryRegion *regs_mr; MemoryRegion *mmio_mr; + MemoryRegion *rng200_mr; + qemu_irq rng_200_irq; int n; =20 bcm_soc_peripherals_common_realize(dev, errp); @@ -94,6 +99,18 @@ static void bcm2838_peripherals_realize(DeviceState *dev= , Error **errp) BCM2838_VC_PERI_LOW_BASE, &s->peri_low_mr_alias, 1); =20 + /* Random Number Generator */ + if (!sysbus_realize(SYS_BUS_DEVICE(&s->rng200), errp)) { + return; + } + + rng200_mr =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->rng200), 0); + memory_region_add_subregion(&s_base->peri_mr, RNG_OFFSET, rng200_mr); + + rng_200_irq =3D qdev_get_gpio_in_named(DEVICE(&s_base->ic), + BCM2835_IC_GPU_IRQ, INTERRUPT_RNG= ); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->rng200), 0, rng_200_irq); + /* Extended Mass Media Controller 2 */ object_property_set_uint(OBJECT(&s->emmc2), "sd-spec-version", 3, &error_abort); diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c index 79f60932..1c063a1c 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-rng200", "brcm,bcm2711-thermal", }; =20 diff --git a/include/hw/arm/bcm2838_peripherals.h b/include/hw/arm/bcm2838_= peripherals.h index 5da340f2..52eabf67 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/misc/bcm2838_rng200.h" #include "hw/arm/bcm2838_pcie.h" #include "hw/net/bcm2838_genet.h" #include "hw/sd/sdhci.h" @@ -68,6 +69,7 @@ struct BCM2838PeripheralState { MemoryRegion peri_low_mr_alias; MemoryRegion mphi_mr_alias; =20 + BCM2838Rng200State rng200; SDHCIState emmc2; BCM2838PcieHostState pcie_host; BCM2838GenetState genet; --=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=1784942864; cv=none; d=zohomail.com; s=zohoarc; b=iFnG+Ki+hmBoIRR+0WQAw0cCNGHKh6KoGCVxVb4qajmEhr/2JpNx1rkuuYe/vdhccMiuwCwiSIEnxfUuIhy0W1/bnQ5QckWiHZ9hFF2w8IL4OSzdZn/JMFaNJvaE0Gg781IFPeW8opvgGjMqnzJS3/k55im5bLE363kFDHPdBCU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784942864; h=Content-Type: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=AHe+xJkUhH4lTnbCnaYnt4eY4xiiCDpGlriXZBo47jA=; b=N96TE+VFdd4Thp57bh6+9OXtAh8JJG6ZuEx1I8BRctBnnSw8+JGBPYciQaLVvErvffNXsT74if4KpORAyJyS+v66a6/vmhRXeXIxWgF+xDLowE8xE97+vAnjH1lMbbe5GuQ85diKrffv5P3IwoyhyAzmBHVdfdyeaQNLViNuYhE= 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 1784942864117354.62646607518184; Fri, 24 Jul 2026 18:27:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnRA8-00051A-Oc; Fri, 24 Jul 2026 21:26: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 1wnRA7-0004zG-55 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:47 -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 1wnRA5-0006G1-AR for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:46 -0400 Received: by mail-ua1-x92d.google.com with SMTP id a1e0cc1a2514c-97723f98735so608760241.3 for ; Fri, 24 Jul 2026 18:26:44 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774c388d7sm1092856241.1.2026.07.24.18.26.41 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 18:26:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784942804; x=1785547604; darn=nongnu.org; h=content-transfer-encoding:content-type: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=AHe+xJkUhH4lTnbCnaYnt4eY4xiiCDpGlriXZBo47jA=; b=EG+VJvj8jCUEZKwrv0dALOjdnMiaLwlU0uYeJvc+f6orsbzPHhQbCBsO6wqJCzTQe2 o8ZwlYHdOVANBtn0IWiCnNHEd1NyTV6Rvn8BYQFTx+U+eZtJy7jnmu1WevmJQaODFH41 ++dVb2MaGpp47fAn+3ljjV4M1cClxegj5ISc4tX1CG2ImYorlPO8UrZhyiFnMs0Ygkn+ Fdi3BvTHnbJS2D5zwaMC8s1xJ3T4RUHtPmxJwc2rbUvshhzb1mQmlY6YqLsH3JJF826k +o/spD/cR3Vj+EXJC5VEhVQMO7HjLKgQAhBgnvgF1+OWDEu/5W5ff7YgsLsgs4LZSwjX sFiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784942804; x=1785547604; h=content-transfer-encoding:content-type: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=AHe+xJkUhH4lTnbCnaYnt4eY4xiiCDpGlriXZBo47jA=; b=ZLRcxaq8zGyjWXQTPgLzQfFuYIEcKKu9OZJ6ggDF3qkPfpjW5LRn8bERKzH91ddnhP fyjDJBm45cULBaTZPoF9wxyzUJAokQ8U+D5E8r8f1J933us2Y7LMNH1O8pnLdVXM8QJi LhSlrj2FRxrfe5N3GXppFNpzTlv+s4XZLDAK0FOlYUH7utQsGRE/9drBynZWlmLJJ0ZH 9iX5Z29M8E0YJhLmsIQVcCggnGuJ36usZZhZufdKDpU8kmhDEAE3Pqdb1mTHUO8VfydQ NU4uhG+6SqoyTJqdrCBddEtscoYzL7cl+xuYUh4bu8alaWPR4jz2upISGMw8O6hGR/pP 5EoQ== X-Gm-Message-State: AOJu0YyDfP9D1yomvfaQroDWFd60XX0nXhDG9K5bxlvmjxLcdLM3KvKM SRSwEuzhZLv+aUOkT2DnkVz0x4O1ENROul4MEeH3bInUenK0NS1hlD8pqGzPm7on X-Gm-Gg: AR+sD13QKcpCsKaJ5OsublgmfNCoeCTFFymliM1KI7/SCJ6OyvPRe5K36MSBKMHTHEY UVboyXBdrFi8JQs12y+Io9JWlUTQch62kyi2CXW1SdtxBppboY2dN/UzocIoiOMIwW4VGKgvIax 9NandjY1jb0pK5j1BpAH5/WZXJUQmEbmR75Qre5N607+XyvabkzS6T/KiFUynH2HUMfGB56RA5u UqCIGA3L9wCYMB9HQ0Sa/4BCYzjciMCti/QVkzJSFdIWGTdAWOl4MwhQd0jnaOsELD1iIxbmKGL 5dgHXJBpLH750qCa/pilhIgeAJ86WNBbVARVSPBvMLxEeCT13wzdZEFmkEbMVI6ryjrd9Imgy3j H04yap4NaL8K1yAdtz9qRN0cgiPqATCCeXE+sY8B4pMwQRCTc06CBgND/NkjhpOCF8JHmuboDa+ s+A4bVRC1Yz4VKAok9xJP2CssAAZbL1R8wxDWYm4zOg8Q= X-Received: by 2002:a05:6102:4bc3:b0:744:dd70:a364 with SMTP id ada2fe7eead31-7503e76a392mr796437137.9.1784942804096; Fri, 24 Jul 2026 18:26:44 -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?= , Sergey Kambalin , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 3/5] hw/misc/bcm2838_thermal: add BCM2838 thermal sensor Date: Fri, 24 Jul 2026 21:26:33 -0400 Message-ID: <20260725012635.4925-4-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725012635.4925-1-marcelomanzo@gmail.com> References: <20260725012635.4925-1-marcelomanzo@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1784942866213158500 From: Sergey Kambalin Add a dummy BCM2838 (BCM2711/Raspberry Pi 4B) thermal sensor: a single status register that always reports a fixed 25C reading with both "valid" bits set. Real hardware reports live temperature; a fixed reading is enough for guests that just probe the sensor and read it, without modeling actual thermal behavior. Part of Sergey Kambalin's original Raspberry Pi 4B series (patchwork series 829638, posted to qemu-devel in 2024, never merged). Ported to current master by Marcelo Manzo: header paths moved under hw/core/, class_init()'s const void *data. No functional change otherwise (this device has no reset or migration state to begin with). Boot-tested: guest's thermal_zone0/temp reports 25310 (25.31C), matching the fixed reading this device returns. Signed-off-by: Sergey Kambalin Signed-off-by: Marcelo Manzo --- hw/misc/bcm2838_thermal.c | 98 +++++++++++++++++++++++++++++++ hw/misc/meson.build | 1 + include/hw/misc/bcm2838_thermal.h | 23 ++++++++ 3 files changed, 122 insertions(+) create mode 100644 hw/misc/bcm2838_thermal.c create mode 100644 include/hw/misc/bcm2838_thermal.h diff --git a/hw/misc/bcm2838_thermal.c b/hw/misc/bcm2838_thermal.c new file mode 100644 index 00000000..40148ddb --- /dev/null +++ b/hw/misc/bcm2838_thermal.c @@ -0,0 +1,98 @@ +/* + * BCM2838 dummy thermal sensor + * + * Copyright (C) 2022 Maksim Kopusov + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "qapi/error.h" +#include "hw/misc/bcm2838_thermal.h" +#include "hw/core/registerfields.h" +#include "migration/vmstate.h" +#include "qemu/error-report.h" + +REG32(STAT, 0x200) +FIELD(STAT, DATA, 0, 10) +FIELD(STAT, VALID_1, 10, 1) +FIELD(STAT, VALID_2, 16, 1) + +#define BCM2838_THERMAL_SIZE 0xf00 + +#define THERMAL_OFFSET_C 410040 +#define THERMAL_COEFF (-487.0f) +#define MILLIDEGREE_COEFF 1000 + +static uint16_t bcm2838_thermal_temp2adc(int temp_C) +{ + return (temp_C * MILLIDEGREE_COEFF - THERMAL_OFFSET_C) / THERMAL_COEFF; +} + +static uint64_t bcm2838_thermal_read(void *opaque, hwaddr addr, unsigned s= ize) +{ + uint32_t val =3D 0; + + switch (addr) { + case A_STAT: + /* Temperature is always 25=C2=B0C */ + val =3D FIELD_DP32(val, STAT, DATA, bcm2838_thermal_temp2adc(25)); + val =3D FIELD_DP32(val, STAT, VALID_1, 1); + val =3D FIELD_DP32(val, STAT, VALID_2, 1); + + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, "%s can't access addr: 0x%"HWADDR_P= RIx, + TYPE_BCM2838_THERMAL, addr); + } + return val; +} + +static void bcm2838_thermal_write(void *opaque, hwaddr addr, + uint64_t value, unsigned size) +{ + qemu_log_mask(LOG_GUEST_ERROR, "%s: write 0x%" PRIx64 + " to 0x%" HWADDR_PRIx "\n", + __func__, value, addr); +} + +static const MemoryRegionOps bcm2838_thermal_ops =3D { + .read =3D bcm2838_thermal_read, + .write =3D bcm2838_thermal_write, + .impl.max_access_size =3D 4, + .valid.min_access_size =3D 4, + .endianness =3D DEVICE_LITTLE_ENDIAN, +}; + +static void bcm2838_thermal_realize(DeviceState *dev, Error **errp) +{ + Bcm2838ThermalState *s =3D BCM2838_THERMAL(dev); + + memory_region_init_io(&s->iomem, OBJECT(s), &bcm2838_thermal_ops, + s, TYPE_BCM2838_THERMAL, BCM2838_THERMAL_SIZE); + sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->iomem); +} + +static void bcm2838_thermal_class_init(ObjectClass *klass, const void *dat= a) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->realize =3D bcm2838_thermal_realize; + + /* This device has no state: no need for vmstate or reset */ +} + +static const TypeInfo bcm2838_thermal_info =3D { + .name =3D TYPE_BCM2838_THERMAL, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(Bcm2838ThermalState), + .class_init =3D bcm2838_thermal_class_init, +}; + +static void bcm2838_thermal_register_types(void) +{ + type_register_static(&bcm2838_thermal_info); +} + +type_init(bcm2838_thermal_register_types) diff --git a/hw/misc/meson.build b/hw/misc/meson.build index cf73ab4c..b4ac064d 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -95,6 +95,7 @@ system_ss.add(when: 'CONFIG_RASPI', if_true: files( 'bcm2835_cprman.c', 'bcm2835_powermgt.c', 'bcm2838_rng200.c', + 'bcm2838_thermal.c', )) system_ss.add(when: 'CONFIG_SLAVIO', if_true: files('slavio_misc.c')) system_ss.add(when: 'CONFIG_ZYNQ', if_true: files('zynq_slcr.c')) diff --git a/include/hw/misc/bcm2838_thermal.h b/include/hw/misc/bcm2838_th= ermal.h new file mode 100644 index 00000000..1ba524ed --- /dev/null +++ b/include/hw/misc/bcm2838_thermal.h @@ -0,0 +1,23 @@ +/* + * BCM2838 dummy thermal sensor + * + * Copyright (C) 2022 Maksim Kopusov + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef BCM2838_THERMAL_H +#define BCM2838_THERMAL_H + +#include "hw/core/sysbus.h" +#include "qom/object.h" + +#define TYPE_BCM2838_THERMAL "bcm2838-thermal" +OBJECT_DECLARE_SIMPLE_TYPE(Bcm2838ThermalState, BCM2838_THERMAL) + +struct Bcm2838ThermalState { + SysBusDevice busdev; + MemoryRegion iomem; +}; + +#endif /* BCM2838_THERMAL_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=1784942886; cv=none; d=zohomail.com; s=zohoarc; b=knbh8Kxku0UF3AziHlTgqdxJ3xxx4G1aWii9Bk9BLNUELPgPJk6CNrWXHtAtydfF+yncbtKD5IjGq84r9oFmvrj1fh/hPdUu8SgGTzZlmqaCWMzbhFl2WwwtFdw94ACzIoN0uNkX9ylKzkQ6CNeOXhr+hSW2K7LC6kneULyvRUo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784942886; 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=Sv4Do54efz6CSaj7wJa92SFTaZ0J6tHEWKHA9fHHKzQ=; b=cc+UH5VCfXrgo8xhbQ9ijJJTkh+WFIkpOFeuz2GVlJ5A7CVn2Ckod8p+av7Im6wbD4F/KuRoTpX5ni5IzmC4wWGodNzXEM3i9+XuW9+RR9LfwSIxeLBzNuT7qE7mzgPDbj5ODoeihj2SmJ8L5bC9HWG5qbj5ec+wE+psPJHg3Uk= 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 1784942886514936.0881035840941; Fri, 24 Jul 2026 18:28:06 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnRAA-00051o-E9; Fri, 24 Jul 2026 21:26: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 1wnRA8-00050Z-CI for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:48 -0400 Received: from mail-vs1-xe36.google.com ([2607:f8b0:4864:20::e36]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnRA6-0006GL-ND for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:48 -0400 Received: by mail-vs1-xe36.google.com with SMTP id ada2fe7eead31-73791ee3612so459241137.1 for ; Fri, 24 Jul 2026 18:26:46 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774c388d7sm1092856241.1.2026.07.24.18.26.44 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 18:26:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784942806; x=1785547606; 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=Sv4Do54efz6CSaj7wJa92SFTaZ0J6tHEWKHA9fHHKzQ=; b=DWnarfuaoebzeDcj/v1UPHmpoKg77FxRx2c/6tv9ieTubF3cF8yy88gir9o6KYX3Tg IEciQGJ+cdqcDtG9dUg0U2tuwTs4cpXV/sa+EHPlLJNftTSKfUC30iHFMlX7JhwtwkTT NREvb4dHcSexx1NbJaecCvnBnC5JKh5YHMaf4fVUqc5X8Md6vC5ezdcX7SH7EgxJzwSZ 45dbVybIyAuu6RYP8qtLVuNNabOhOpzjkF1EMgXi7oQpks/J6dfvOeKyCcF+ziyMYAaj rM8kfa6gCRu4Zy2BbSi/oY9tfOrCZ88aYS3Ad8gWVAFM4DX0A1JS+zJ8ero1sH9A4zeW X+Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784942806; x=1785547606; 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=Sv4Do54efz6CSaj7wJa92SFTaZ0J6tHEWKHA9fHHKzQ=; b=pw0jzC3r4QDODX5oAj3Ftashyux6FGYdAGmJY2PjnMGHQfuP1VMLPBkgpcbNohv/E0 dA4UI3TbI4D7CCNWXSnpTZR5PFbYomNwuNqfAm5Iz1o1RQl4FQznsqrxekUBalLS1FIY JykYdhQBmluZyQ0C6iOavTIvHEZJYT46pXAUU5CLCbnMHIBobbzYsDfEQhMPmSVqrgx8 RhTad7pFr00qRkDG/DrQ4Qqv5YL/FVsF9GgmKLbxIo6tLyHH4ZBS4emBVcAUweCX9rlU AmsXpEzzXQg6qRMEXcF28gFKGoLKdXV3mk4DZaaAPCguL75rJ3fnQJeGk1njxa0nvYeh 7hew== X-Gm-Message-State: AOJu0YwxhM6S0nVnTHWRCKY1RtLfpgJ5yn/Bt3HvhSNff6Im8BcHuW+Z ATCNq0rtAQBsW7uQ+J8AgZBHadvNL6uRR29/+1gAznjjXrffPLqZQcmpG12lLRpk X-Gm-Gg: AR+sD12xhKEDZjo7sfn5uMF3t+RDHVbUAbALrPXRZs481iMR6WKYk2uU4Ur3cHGlnET ec7TpaYlMONZJutw6BJWjzeifq0US8/irjVHqeJ6tBiw1BqMp5uozon6iSZF29DVh0VelUJ1tas TQgKaBEq/ZYRzIHh8j0gSDbkY/vl5r2KnqebMYqXy963qjl4KTHad331JF5LHp9FWLMXsv6FSDp PAXW8ZMPUq3jijTeGYWvNc1hKZGV61a9tDf6Yt6Id9qks5aVo0DYLMeAijHsA2u/UmGgnuwN/jU qti8WcbXnDL78DXoESr4ths0QHsc6EGIQhlWA2OJD8HhJ56punhLGzbgD42f7bvWz2k8F1M7XSj AcSNCubB+jI/GNlJwj/7tT9mLcl8kpX0832nnlhai4QGp4GUA59fP5xR01mjRcQIUZXrn27VBs7 LCvURTpDiymnnSwPiJlZv57nmGCNPs9aS6 X-Received: by 2002:a05:6102:94f:b0:726:cd42:d039 with SMTP id ada2fe7eead31-750409bda93mr694912137.24.1784942805732; Fri, 24 Jul 2026 18:26:45 -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?= , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 4/5] hw/arm/bcm2838: enable BCM2838 thermal sensor Date: Fri, 24 Jul 2026 21:26:34 -0400 Message-ID: <20260725012635.4925-5-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725012635.4925-1-marcelomanzo@gmail.com> References: <20260725012635.4925-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::e36; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe36.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1784942887842158500 Content-Type: text/plain; charset="utf-8" Wire the BCM2838 thermal sensor (added in the previous patch) into the SoC: instantiate it in the peripherals block and map its register region at the real BCM2711 physical address. This is also the last device masked out of the raspi4b DTB, so drop the "brcm,bcm2711-thermal" node-removal entry -- and with it the whole nodes_to_remove[] mechanism in raspi4_modify_dtb(), which is now empty (GENET, PCIe, RNG200, and this thermal sensor were the only four devices it ever masked, and all four are now implemented). Adapted from patch 17/41 of Sergey Kambalin's Raspberry Pi 4B series (patchwork series 829638) against current QEMU master. Signed-off-by: Marcelo Manzo --- hw/arm/bcm2838_peripherals.c | 11 +++++++++++ hw/arm/raspi4b.c | 18 ------------------ include/hw/arm/bcm2838_peripherals.h | 2 ++ 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/hw/arm/bcm2838_peripherals.c b/hw/arm/bcm2838_peripherals.c index 7c202b00..c268fffd 100644 --- a/hw/arm/bcm2838_peripherals.c +++ b/hw/arm/bcm2838_peripherals.c @@ -43,6 +43,9 @@ static void bcm2838_peripherals_init(Object *obj) /* Random Number Generator */ object_initialize_child(obj, "rng200", &s->rng200, TYPE_BCM2838_RNG200= ); =20 + /* Thermal */ + object_initialize_child(obj, "thermal", &s->thermal, TYPE_BCM2838_THER= MAL); + /* PCIe Host Bridge */ object_initialize_child(obj, "pcie-host", &s->pcie_host, TYPE_BCM2838_PCIE_HOST); @@ -87,6 +90,7 @@ static void bcm2838_peripherals_realize(DeviceState *dev,= Error **errp) MemoryRegion *mmio_mr; MemoryRegion *rng200_mr; qemu_irq rng_200_irq; + MemoryRegion *thermal_mr; int n; =20 bcm_soc_peripherals_common_realize(dev, errp); @@ -111,6 +115,13 @@ static void bcm2838_peripherals_realize(DeviceState *d= ev, Error **errp) BCM2835_IC_GPU_IRQ, INTERRUPT_RNG= ); sysbus_connect_irq(SYS_BUS_DEVICE(&s->rng200), 0, rng_200_irq); =20 + /* THERMAL */ + if (!sysbus_realize(SYS_BUS_DEVICE(&s->thermal), errp)) { + return; + } + thermal_mr =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->thermal), 0); + memory_region_add_subregion(&s->peri_low_mr, 0x15D2000, thermal_mr); + /* Extended Mass Media Controller 2 */ object_property_set_uint(OBJECT(&s->emmc2), "sd-spec-version", 3, &error_abort); diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c index 1c063a1c..b92840e1 100644 --- a/hw/arm/raspi4b.c +++ b/hw/arm/raspi4b.c @@ -62,24 +62,6 @@ static void raspi4_modify_dtb(const struct arm_boot_info= *info, void *fdt) { uint64_t ram_size; =20 - /* Temporarily disable following devices until they are implemented */ - const char *nodes_to_remove[] =3D { - "brcm,bcm2711-thermal", - }; - - for (int i =3D 0; i < ARRAY_SIZE(nodes_to_remove); i++) { - const char *dev_str =3D nodes_to_remove[i]; - int offset; - - offset =3D fdt_node_offset_by_compatible(fdt, -1, dev_str); - while (offset >=3D 0) { - if (fdt_nop_node(fdt, offset) =3D=3D 0) { - warn_report("bcm2711 dtb: %s has been disabled!", dev_str); - } - offset =3D fdt_node_offset_by_compatible(fdt, offset, dev_str); - } - } - ram_size =3D board_ram_size(info->board_id); =20 if (info->ram_size > UPPER_RAM_BASE) { diff --git a/include/hw/arm/bcm2838_peripherals.h b/include/hw/arm/bcm2838_= peripherals.h index 52eabf67..49ca780b 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/misc/bcm2838_rng200.h" +#include "hw/misc/bcm2838_thermal.h" #include "hw/arm/bcm2838_pcie.h" #include "hw/net/bcm2838_genet.h" #include "hw/sd/sdhci.h" @@ -70,6 +71,7 @@ struct BCM2838PeripheralState { MemoryRegion mphi_mr_alias; =20 BCM2838Rng200State rng200; + Bcm2838ThermalState thermal; SDHCIState emmc2; BCM2838PcieHostState pcie_host; BCM2838GenetState genet; --=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=1784942863; cv=none; d=zohomail.com; s=zohoarc; b=KLrwJZ99uszPRQEbXUSBLSLZIISHWuyt/pZgHRM+wQaAsocuuvodCvTMnaRCWWpKofn+8GnTJ3E23pzqJmwjB1/HXY0ITyxsftDh9zeodZRdn9fOM5n+fjN5LtSB5l/DQEVuq9Juk7LDErpo5VxgE86i4msczS7Ph03qZfm8ceg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1784942863; 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=bJ2r/gMDRkwdyWL70QN40YSq4nEajyBo622BX23Tmqk=; b=HJ1+9zlyfsfrbPOZJ35VKrReK4UcekNVTcnXhTqQqS5mTbr6uAAgrD0Z2pr6WFsT5GoCheYdzXPGuvysVL8oOMO/byjWlGGSUfXJOEhgOwjoEfYC3d+nyddyKKKT0yWZ/lTr1salwuEzVE3byOAhi+qjLWS+UZA8CoZCh/pxBmA= 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 1784942863675188.08533079224685; Fri, 24 Jul 2026 18:27:43 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wnRAC-00052I-Tg; Fri, 24 Jul 2026 21:26:52 -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 1wnRAB-00051r-3m for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:51 -0400 Received: from mail-vs1-xe31.google.com ([2607:f8b0:4864:20::e31]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1wnRA9-0006Gz-N4 for qemu-devel@nongnu.org; Fri, 24 Jul 2026 21:26:50 -0400 Received: by mail-vs1-xe31.google.com with SMTP id ada2fe7eead31-726840fb461so256995137.0 for ; Fri, 24 Jul 2026 18:26:49 -0700 (PDT) Received: from localhost.localdomain ([146.71.8.128]) by smtp.gmail.com with ESMTPSA id a1e0cc1a2514c-97774c388d7sm1092856241.1.2026.07.24.18.26.45 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Fri, 24 Jul 2026 18:26:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784942809; x=1785547609; 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=bJ2r/gMDRkwdyWL70QN40YSq4nEajyBo622BX23Tmqk=; b=gg6BEe9ikmCbnRRq6W+OTvT1k920os2O48Y6SDlLmP76yp2TT2xyaxcCQ5TJIohNab TjJHWHguVmZ3AbbhGQcIF2FThsaFoU6D+oX2uEX2rW10OGmEiOv0tm1MLuEFhdTH4Zz2 whQLjVchAet+YX6XAzrUGZd/64jbPMuYdl3aioX5aJ8a51rVdfebAHQZwe+dv3J8MDMk NosVQyxr4GlJcWN0bNaD/EpmRp0cZ9j7tkzldGPN/0HGcDZEKqaJbf1kS30Akbbl5f6x TsDrUJVOuIboBALzo2FqNZKFaC3LF+canFo2rumpSe+YNRvjrH7a3BgdjClgFwjm1Mjm dhbQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784942809; x=1785547609; 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=bJ2r/gMDRkwdyWL70QN40YSq4nEajyBo622BX23Tmqk=; b=NeSyddI7r2VKy6QJvwLeUYF+/7W1NLRwdM6EpwfllIZRDqzzWd9qRvx3ZBLjrxMV0/ lKoWWLflz78lp3gtVhBZczPRVqwPj9EX1YlXGvF+/8wDmqftRJfO5bWpSNkEex8NPIGv Q7BJnqHW2azUaxfhKKJFrfIIYUcz7wNMzvYm6HOjHYo1rmO18ZdSLW+cWvYa7AZx1A6B 0tOOKLwkR0cGAA/NI/6c4FxKQyUWKcA174oIneHX/gvohgAfRu/RSL+ChG0YEfjW306P t+yx6HD5CoSOdqTchDANw6Jo8PAmSeJnbCQQKmysZN89syTDqRP9wgORTKsvKnQinMlx e5dw== X-Gm-Message-State: AOJu0YxltZZqvD8Vjg5fOlNKmzroNyjrxblO6ycU0AVMst8znHIqgQBG iLsoGie9WUJiW1qeHOl4xq1lN5riWx30nik+iKATpBycpo93dFLytPyW+YOC+1Ga X-Gm-Gg: AR+sD13jr748lORzximIBWay4fhnLhZ5LImMufJuX2ynDCkTE2bZWyDszASKH0a4Tev HETTrEVcTur9R2LJO+GS/Ajhrb4NqJshzHfqUdAvgDUoVDBF4BG9meFL47ipiKQ0EN7MtMnGbhn OUieAiBMXN8UqLMt84wpvnvEXhy1vTHSz4wVhyytJCCdBHYllP+h63YWlPttnyX13VsNoj1RhN6 i5nkUG7sA0vKkswKqBSdl/G7nlaImOdMVEsRVrXafLbCEmNrqebmJNPkamOhvs0ki6hL7UUCRn+ WQXzIt5ozii+wQNbXSq1NRLzUtb5r6TjrcdOXtViN8XV/CDMC6blkr9aiZKgf1/EuVXRkzNq6wr pwsYEabQEuPBD3utFZMNOohDizOPmQR1jLFQPeEFzXyEaFs/msYKJkF2fLqxW5F7yiuq8gdAXq7 FkaI3RuzMB961BtC+Et9XlK57iNmN1Zk2Z X-Received: by 2002:a05:6102:3711:b0:739:8c52:f2b with SMTP id ada2fe7eead31-7503fb97f37mr727666137.18.1784942808639; Fri, 24 Jul 2026 18:26:48 -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?= , Sergey Kambalin , Marcelo Manzo Subject: [PATCH 5/5] tests/functional/aarch64: add raspi4b RNG200/thermal test Date: Fri, 24 Jul 2026 21:26:35 -0400 Message-ID: <20260725012635.4925-6-marcelomanzo@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20260725012635.4925-1-marcelomanzo@gmail.com> References: <20260725012635.4925-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::e31; envelope-from=marcelomanzo@gmail.com; helo=mail-vs1-xe31.google.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FROM=0.001, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @gmail.com) X-ZM-MESSAGEID: 1784942866180158500 Content-Type: text/plain; charset="utf-8" Add test_arm_raspi4_rng_thermal, exercising the raspi4b RNG200 and thermal sensor devices added in this series: boot, confirm the RNG200 driver probes it ("hwrng registered" in the kernel log), reach a shell, and confirm the thermal zone reports the expected fixed reading and /dev/hwrng actually yields data rather than just existing. Verified locally against this series with the exact kernel/initrd assets this file already pins. Signed-off-by: Marcelo Manzo --- tests/functional/aarch64/test_raspi4.py | 32 +++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tests/functional/aarch64/test_raspi4.py b/tests/functional/aar= ch64/test_raspi4.py index 0e254a20..69748ce5 100755 --- a/tests/functional/aarch64/test_raspi4.py +++ b/tests/functional/aarch64/test_raspi4.py @@ -122,5 +122,37 @@ def test_arm_raspi4_genet(self): exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System ha= lted') =20 =20 + def test_arm_raspi4_rng_thermal(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') + self.vm.launch() + self.wait_for_console_pattern( + 'iproc-rng200 fe104000.rng: hwrng registered') + self.wait_for_console_pattern('Boot successful.') + + exec_command_and_wait_for_pattern( + self, 'cat /sys/devices/virtual/thermal/thermal_zone0/temp', + '25310') + exec_command_and_wait_for_pattern(self, 'head -c 8 /dev/hwrng | xx= d', + '00000000:') + exec_command_and_wait_for_pattern(self, 'halt', 'reboot: System ha= lted') + + if __name__ =3D=3D '__main__': LinuxKernelTest.main() --=20 2.47.1