From nobody Sat May 3 20:06:42 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=fail(p=none dis=none) header.from=linaro.org Return-Path: <devel-bounces@lists.libvirt.org> Received: from lists.libvirt.org (lists.libvirt.org [8.43.85.245]) by mx.zohomail.com with SMTPS id 1738628652254938.444604953648; Mon, 3 Feb 2025 16:24:12 -0800 (PST) Received: by lists.libvirt.org (Postfix, from userid 996) id 39004B7E; Mon, 3 Feb 2025 19:24:11 -0500 (EST) Received: from lists.libvirt.org (localhost [IPv6:::1]) by lists.libvirt.org (Postfix) with ESMTP id 649CE199D; Mon, 3 Feb 2025 19:23:12 -0500 (EST) Received: by lists.libvirt.org (Postfix, from userid 996) id D4A581B29; Mon, 3 Feb 2025 19:23:07 -0500 (EST) Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id A79BF1A58 for <devel@lists.libvirt.org>; Mon, 3 Feb 2025 19:22:56 -0500 (EST) Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-38da88e6db0so41898f8f.2 for <devel@lists.libvirt.org>; Mon, 03 Feb 2025 16:22:56 -0800 (PST) Received: from localhost.localdomain (88-187-86-199.subs.proxad.net. [88.187.86.199]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-438e23d42d4sm176306255e9.6.2025.02.03.16.22.52 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Mon, 03 Feb 2025 16:22:54 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-0.7 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_HELO_NONE autolearn=unavailable autolearn_force=no version=3.4.4 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1738628575; x=1739233375; darn=lists.libvirt.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vsIKyI+e9av35VOR6IuoP5pHXQj36xoMmsdPAwqdbVY=; b=uvCRD4sw/3wdpDOdoGPoko/7URjxdHMTZyvWOI35SCHvZrWKCLueGh8UAx4vRddqtR s/2xaA/JAiM1Pz6ZIuPYslSfTagfelcdfpha2beay1lPYSCwm7bzJ8Nj+Fnqr1sm3zrb WJRl9S8hye6PzKMBJz+9VNoRahupgMpfqegmDudCZy6rtZqCP8ErVeEeLer5AI69YmWq 4/Vr4VuzD9w5f1i25TOEW65q4A4zZn82q8V5E6McjQ7GPq7vTymUE02O4IF+AFLTB6jp 67dPZ7AS4BsdpC4lRmKwgs6D7KJseoPP5SAGebzga6KPsRRJvuCMjq3mLZQKlnQdsyvT BryQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1738628575; x=1739233375; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vsIKyI+e9av35VOR6IuoP5pHXQj36xoMmsdPAwqdbVY=; b=n3FqRo+GWPxTVyEyORknQYBflNUOjshySVu3WRUlPP/eIn/5C/czdW10SpU6QF5EI0 o8B/a+BB9d0Lgiyc2zpnwBO9ztEuoCQhaHGLUGqmEkzgD8giov7THmurS9qtjrvXcyTO WtjKVTEVMPtQJSAmoO9N7EUwU3T3xR0SSpBoc/Y3TI3LDyZ//JbAXjvFB8Q54p2C0qZM 1PB5Ua+lbOnCuFB6WFe7m/PhpKHWeG4q6oFH27hknuFwHR44djGZVGkvaQDNY1qbiKWJ GrP8xTx9UNrh8tolDKmwPiY/IoPsgciKuVZQRk0uSsGJTXHxyg7z89salwE7uzYBvYV0 +hwg== X-Forwarded-Encrypted: i=1; AJvYcCUtKFp29xNtpQZCvYeeoWZfjH7f+jZNOYkaAKilgKoU/IFN0nB01wMf7xf+vanYojBNFuboDQ==@lists.libvirt.org X-Gm-Message-State: AOJu0YxxCtt9ru8aNHbDb+NM1BK+53nB2gLP9mJ8vtN62poGSptwnKvZ 0xEGfTZbYYQZRhsCsXwI12ZetHCf7IHgSd74A0ZZ0MCAvoph8LLGoT54E66UvFI= X-Gm-Gg: ASbGncsJ18sYHPw7Af9quZ2HHKLNJ/plGhxoxMvaoCcDKdRQujuOZeia1M64fF1agew /msGXShtWb3dtJgqJerQ/02FZJcPkg2EBY+wY5R5LLDPWgfUnZJbsDnmrwIeDuuxury51qF9t48 QzmzwC82ndj4VxpzpUg7YKyVc7nEZ2rtqdBoFrmdEb83sQDGejzYiMXShUlYHEEeBaFeNzLoC2I NY2fQaZr5reUE1bJN3/0ybSSLCeuNDrtHa1aoOwLTT0Cz8CTet6SWjM37C/LX6PDgDgK951geMX cVueYPjhpOqBcNETh1eadHV1H71090/w/ScHvwURu9nDtdQTwGdQ7uf4haswIJdvCg== X-Google-Smtp-Source: AGHT+IHjNmmsTMwFvgzRhtIJozEro1HlPr24eqil0s/FSv2CSBrheY5n6kgxKDAO4uVJteUcr+rZ4g== X-Received: by 2002:a05:6000:1942:b0:386:1cd3:8a0e with SMTP id ffacd0b85a97d-38c520b96f8mr16092847f8f.48.1738628575462; Mon, 03 Feb 2025 16:22:55 -0800 (PST) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@linaro.org> To: qemu-devel@nongnu.org Subject: [PATCH v2 02/12] hw/arm/raspi: Merge model 4B with other models Date: Tue, 4 Feb 2025 01:22:30 +0100 Message-ID: <20250204002240.97830-3-philmd@linaro.org> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250204002240.97830-1-philmd@linaro.org> References: <20250204002240.97830-1-philmd@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Message-ID-Hash: NIV24YOQFR57FGWZOWKG6ENPVVHQHHPO X-Message-ID-Hash: NIV24YOQFR57FGWZOWKG6ENPVVHQHHPO X-MailFrom: philmd@linaro.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; header-match-config-1; header-match-config-2; header-match-config-3; header-match-devel.lists.libvirt.org-0 CC: BALATON Zoltan <balaton@eik.bme.hu>, Peter Maydell <peter.maydell@linaro.org>, Laurent Vivier <lvivier@redhat.com>, Ovchinnikov Vitalii <vitalii.ovchinnikov@auriga.com>, =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= <philmd@linaro.org>, Jared Mauch <jared+home@puck.nether.net>, Fabiano Rosas <farosas@suse.de>, Paolo Bonzini <pbonzini@redhat.com>, qemu-arm@nongnu.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= <alex.bennee@linaro.org>, devel@lists.libvirt.org X-Mailman-Version: 3.2.2 Precedence: list List-Id: Development discussions about the libvirt library & tools <devel.lists.libvirt.org> Archived-At: <https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/message/NIV24YOQFR57FGWZOWKG6ENPVVHQHHPO/> List-Archive: <https://lists.libvirt.org/archives/list/devel@lists.libvirt.org/> List-Help: <mailto:devel-request@lists.libvirt.org?subject=help> List-Post: <mailto:devel@lists.libvirt.org> List-Subscribe: <mailto:devel-join@lists.libvirt.org> List-Unsubscribe: <mailto:devel-leave@lists.libvirt.org> X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1738628655018019100 Content-Type: text/plain; charset="utf-8" Except we alter the device tree blob, the 4B is just another raspi model. Signed-off-by: Philippe Mathieu-Daud=C3=A9 <philmd@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> --- hw/arm/raspi.c | 114 ++++++++++++++++++++++++++++++++++++- hw/arm/raspi4b.c | 136 --------------------------------------------- hw/arm/meson.build | 2 +- 3 files changed, 114 insertions(+), 138 deletions(-) delete mode 100644 hw/arm/raspi4b.c diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c index 508f90479e2..3fa382d62ce 100644 --- a/hw/arm/raspi.c +++ b/hw/arm/raspi.c @@ -8,6 +8,10 @@ * Raspberry Pi 3 emulation Copyright (c) 2018 Zolt=C3=A1n Baldaszti * Upstream code cleanup (c) 2018 Pekka Enberg * + * Raspberry Pi 4 emulation Copyright (C) 2022 Ovchinnikov Vitalii + * + * SPDX-License-Identifier: GPL-2.0-or-later + * * This work is licensed under the terms of the GNU GPL, version 2 or late= r. * See the COPYING file in the top-level directory. */ @@ -16,20 +20,27 @@ #include "qemu/units.h" #include "qemu/cutils.h" #include "qapi/error.h" +#include "qapi/visitor.h" #include "hw/arm/boot.h" #include "hw/arm/bcm2836.h" #include "hw/arm/bcm2838.h" #include "hw/arm/raspi_platform.h" +#include "hw/display/bcm2835_fb.h" #include "hw/registerfields.h" #include "qemu/error-report.h" #include "hw/boards.h" #include "hw/loader.h" #include "hw/arm/boot.h" #include "qom/object.h" +#include "system/device_tree.h" +#include <libfdt.h> =20 #define TYPE_RASPI_MACHINE MACHINE_TYPE_NAME("raspi-common") OBJECT_DECLARE_SIMPLE_TYPE(RaspiMachineState, RASPI_MACHINE) =20 +#define TYPE_RASPI4B_MACHINE MACHINE_TYPE_NAME("raspi4b") +OBJECT_DECLARE_SIMPLE_TYPE(Raspi4bMachineState, RASPI4B_MACHINE) + #define SMPBOOT_ADDR 0x300 /* this should leave enough space for ATAGS = */ #define MVBAR_ADDR 0x400 /* secure vectors */ #define BOARDSETUP_ADDR (MVBAR_ADDR + 0x20) /* board setup code */ @@ -44,6 +55,11 @@ struct RaspiMachineState { BCM283XState soc; }; =20 +struct Raspi4bMachineState { + RaspiBaseMachineState parent_obj; + BCM2838State soc; +}; + /* * Board revision codes: * www.raspberrypi.org/documentation/hardware/raspberrypi/revision-codes/ @@ -301,6 +317,83 @@ void raspi_base_machine_init(MachineState *machine, boot_ram_size); } =20 +#ifdef TARGET_AARCH64 +/* + * Add second memory region if board RAM amount exceeds VC base address + * (see https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf + * 1.2 Address Map) + */ +static int raspi4_add_memory_node(void *fdt, hwaddr mem_base, hwaddr mem_l= en) +{ + int ret; + uint32_t acells, scells; + char *nodename =3D g_strdup_printf("/memory@%" PRIx64, mem_base); + + acells =3D qemu_fdt_getprop_cell(fdt, "/", "#address-cells", + NULL, &error_fatal); + scells =3D qemu_fdt_getprop_cell(fdt, "/", "#size-cells", + NULL, &error_fatal); + if (acells =3D=3D 0 || scells =3D=3D 0) { + fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0= )\n"); + ret =3D -1; + } else { + qemu_fdt_add_subnode(fdt, nodename); + qemu_fdt_setprop_string(fdt, nodename, "device_type", "memory"); + ret =3D qemu_fdt_setprop_sized_cells(fdt, nodename, "reg", + acells, mem_base, + scells, mem_len); + } + + g_free(nodename); + return ret; +} + +static void raspi4_modify_dtb(const struct arm_boot_info *info, void *fdt) +{ + uint64_t ram_size; + + /* 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", + }; + + for (int i =3D 0; i < ARRAY_SIZE(nodes_to_remove); i++) { + const char *dev_str =3D nodes_to_remove[i]; + + int offset =3D fdt_node_offset_by_compatible(fdt, -1, dev_str); + if (offset >=3D 0) { + if (!fdt_nop_node(fdt, offset)) { + warn_report("bcm2711 dtc: %s has been disabled!", dev_str); + } + } + } + + ram_size =3D board_ram_size(info->board_id); + + if (info->ram_size > UPPER_RAM_BASE) { + raspi4_add_memory_node(fdt, UPPER_RAM_BASE, ram_size - UPPER_RAM_B= ASE); + } +} + +static void raspi4b_machine_init(MachineState *machine) +{ + Raspi4bMachineState *s =3D RASPI4B_MACHINE(machine); + RaspiBaseMachineState *s_base =3D RASPI_BASE_MACHINE(machine); + RaspiBaseMachineClass *mc =3D RASPI_BASE_MACHINE_GET_CLASS(machine); + BCM2838State *soc =3D &s->soc; + + s_base->binfo.modify_dtb =3D raspi4_modify_dtb; + s_base->binfo.board_id =3D mc->board_rev; + + object_initialize_child(OBJECT(machine), "soc", soc, + board_soc_type(mc->board_rev)); + raspi_base_machine_init(machine, BCM283X_BASE(soc)); +} +#endif /* TARGET_AARCH64 */ + void raspi_machine_init(MachineState *machine) { RaspiMachineState *s =3D RASPI_MACHINE(machine); @@ -382,6 +475,20 @@ static void raspi3b_machine_class_init(ObjectClass *oc= , void *data) rmc->board_rev =3D 0xa02082; raspi_machine_class_init(mc, rmc->board_rev); }; + +static void raspi4b_machine_class_init(ObjectClass *oc, void *data) +{ + MachineClass *mc =3D MACHINE_CLASS(oc); + RaspiBaseMachineClass *rmc =3D RASPI_BASE_MACHINE_CLASS(oc); + +#if HOST_LONG_BITS =3D=3D 32 + rmc->board_rev =3D 0xa03111; /* Revision 1.1, 1 Gb RAM */ +#else + rmc->board_rev =3D 0xb03115; /* Revision 1.5, 2 Gb RAM */ +#endif + raspi_machine_class_common_init(mc, rmc->board_rev); + mc->init =3D raspi4b_machine_init; +} #endif /* TARGET_AARCH64 */ =20 static const TypeInfo raspi_machine_types[] =3D { @@ -406,7 +513,12 @@ static const TypeInfo raspi_machine_types[] =3D { .name =3D MACHINE_TYPE_NAME("raspi3b"), .parent =3D TYPE_RASPI_MACHINE, .class_init =3D raspi3b_machine_class_init, -#endif + }, { + .name =3D MACHINE_TYPE_NAME("raspi4"), + .parent =3D TYPE_RASPI_BASE_MACHINE, + .instance_size =3D sizeof(Raspi4bMachineState), + .class_init =3D raspi4b_machine_class_init, +#endif /* TARGET_AARCH64 */ }, { .name =3D TYPE_RASPI_MACHINE, .parent =3D TYPE_RASPI_BASE_MACHINE, diff --git a/hw/arm/raspi4b.c b/hw/arm/raspi4b.c deleted file mode 100644 index 9b08a598f39..00000000000 --- a/hw/arm/raspi4b.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Raspberry Pi 4B emulation - * - * Copyright (C) 2022 Ovchinnikov Vitalii <vitalii.ovchinnikov@auriga.com> - * - * SPDX-License-Identifier: GPL-2.0-or-later - */ - -#include "qemu/osdep.h" -#include "qemu/units.h" -#include "qemu/cutils.h" -#include "qapi/error.h" -#include "qapi/visitor.h" -#include "hw/arm/raspi_platform.h" -#include "hw/display/bcm2835_fb.h" -#include "hw/registerfields.h" -#include "qemu/error-report.h" -#include "system/device_tree.h" -#include "hw/boards.h" -#include "hw/loader.h" -#include "hw/arm/boot.h" -#include "qom/object.h" -#include "hw/arm/bcm2838.h" -#include <libfdt.h> - -#define TYPE_RASPI4B_MACHINE MACHINE_TYPE_NAME("raspi4b") -OBJECT_DECLARE_SIMPLE_TYPE(Raspi4bMachineState, RASPI4B_MACHINE) - -struct Raspi4bMachineState { - RaspiBaseMachineState parent_obj; - BCM2838State soc; -}; - -/* - * Add second memory region if board RAM amount exceeds VC base address - * (see https://datasheets.raspberrypi.com/bcm2711/bcm2711-peripherals.pdf - * 1.2 Address Map) - */ -static int raspi_add_memory_node(void *fdt, hwaddr mem_base, hwaddr mem_le= n) -{ - int ret; - uint32_t acells, scells; - char *nodename =3D g_strdup_printf("/memory@%" PRIx64, mem_base); - - acells =3D qemu_fdt_getprop_cell(fdt, "/", "#address-cells", - NULL, &error_fatal); - scells =3D qemu_fdt_getprop_cell(fdt, "/", "#size-cells", - NULL, &error_fatal); - if (acells =3D=3D 0 || scells =3D=3D 0) { - fprintf(stderr, "dtb file invalid (#address-cells or #size-cells 0= )\n"); - ret =3D -1; - } else { - qemu_fdt_add_subnode(fdt, nodename); - qemu_fdt_setprop_string(fdt, nodename, "device_type", "memory"); - ret =3D qemu_fdt_setprop_sized_cells(fdt, nodename, "reg", - acells, mem_base, - scells, mem_len); - } - - g_free(nodename); - return ret; -} - -static void raspi4_modify_dtb(const struct arm_boot_info *info, void *fdt) -{ - uint64_t ram_size; - - /* 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", - }; - - for (int i =3D 0; i < ARRAY_SIZE(nodes_to_remove); i++) { - const char *dev_str =3D nodes_to_remove[i]; - - int offset =3D fdt_node_offset_by_compatible(fdt, -1, dev_str); - if (offset >=3D 0) { - if (!fdt_nop_node(fdt, offset)) { - warn_report("bcm2711 dtc: %s has been disabled!", dev_str); - } - } - } - - ram_size =3D board_ram_size(info->board_id); - - if (info->ram_size > UPPER_RAM_BASE) { - raspi_add_memory_node(fdt, UPPER_RAM_BASE, ram_size - UPPER_RAM_BA= SE); - } -} - -static void raspi4b_machine_init(MachineState *machine) -{ - Raspi4bMachineState *s =3D RASPI4B_MACHINE(machine); - RaspiBaseMachineState *s_base =3D RASPI_BASE_MACHINE(machine); - RaspiBaseMachineClass *mc =3D RASPI_BASE_MACHINE_GET_CLASS(machine); - BCM2838State *soc =3D &s->soc; - - s_base->binfo.modify_dtb =3D raspi4_modify_dtb; - s_base->binfo.board_id =3D mc->board_rev; - - object_initialize_child(OBJECT(machine), "soc", soc, - board_soc_type(mc->board_rev)); - - raspi_base_machine_init(machine, BCM283X_BASE(soc)); -} - -static void raspi4b_machine_class_init(ObjectClass *oc, void *data) -{ - MachineClass *mc =3D MACHINE_CLASS(oc); - RaspiBaseMachineClass *rmc =3D RASPI_BASE_MACHINE_CLASS(oc); - -#if HOST_LONG_BITS =3D=3D 32 - rmc->board_rev =3D 0xa03111; /* Revision 1.1, 1 Gb RAM */ -#else - rmc->board_rev =3D 0xb03115; /* Revision 1.5, 2 Gb RAM */ -#endif - raspi_machine_class_common_init(mc, rmc->board_rev); - mc->init =3D raspi4b_machine_init; -} - -static const TypeInfo raspi4b_machine_type =3D { - .name =3D TYPE_RASPI4B_MACHINE, - .parent =3D TYPE_RASPI_BASE_MACHINE, - .instance_size =3D sizeof(Raspi4bMachineState), - .class_init =3D raspi4b_machine_class_init, -}; - -static void raspi4b_machine_register_type(void) -{ - type_register_static(&raspi4b_machine_type); -} - -type_init(raspi4b_machine_register_type) diff --git a/hw/arm/meson.build b/hw/arm/meson.build index 490234b3b84..5177260d42b 100644 --- a/hw/arm/meson.build +++ b/hw/arm/meson.build @@ -27,7 +27,7 @@ arm_ss.add(when: 'CONFIG_ALLWINNER_A10', if_true: files('= allwinner-a10.c', 'cubi arm_ss.add(when: 'CONFIG_ALLWINNER_H3', if_true: files('allwinner-h3.c', '= orangepi.c')) arm_ss.add(when: 'CONFIG_ALLWINNER_R40', if_true: files('allwinner-r40.c',= 'bananapi_m2u.c')) arm_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2836.c', 'raspi.c')) -arm_ss.add(when: ['CONFIG_RASPI', 'TARGET_AARCH64'], if_true: files('bcm28= 38.c', 'raspi4b.c')) +arm_ss.add(when: ['CONFIG_RASPI', 'TARGET_AARCH64'], if_true: files('bcm28= 38.c')) arm_ss.add(when: 'CONFIG_STM32F100_SOC', if_true: files('stm32f100_soc.c')) arm_ss.add(when: 'CONFIG_STM32F205_SOC', if_true: files('stm32f205_soc.c')) arm_ss.add(when: 'CONFIG_STM32F405_SOC', if_true: files('stm32f405_soc.c')) --=20 2.47.1