From patchwork Mon Feb 13 16:20:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bernhard Beschow X-Patchwork-Id: 1741744 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20210112 header.b=gn1XKj5y; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4PFqNc42VWz23h0 for ; Tue, 14 Feb 2023 03:21:52 +1100 (AEDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pRbZe-0004rH-WC; Mon, 13 Feb 2023 11:21:03 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pRbZV-0004g4-1C; Mon, 13 Feb 2023 11:20:55 -0500 Received: from mail-ej1-x629.google.com ([2a00:1450:4864:20::629]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1pRbZR-0007zB-6Z; Mon, 13 Feb 2023 11:20:51 -0500 Received: by mail-ej1-x629.google.com with SMTP id qb15so31139359ejc.1; Mon, 13 Feb 2023 08:20:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; 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=w7TYkI/++FXvnkpoOiqybcbrgtqyZejgSKUe6dTILis=; b=gn1XKj5yvZa9/ZuPY8Y/MwVFc4LKTBkFoT59GzJJeWtQj+KH1IOpEODqiSsexd3J+Z skdzQS1xya1JwRlVAAnsH/QkMlc2xSLsauaIjIzHQfkglXMML9tdsaqzFdRL4LNBqJJu lCJu8kHeNIYR1KR8W2m6Y6JNRDcMcut9WXV5wsg9HLBF93WssgSQdsYf5/n94jAIkYrq n5RJI0bXnP2gM1QoMfNNxmBQkO0AjgAHCr3reRl8zF+q2yvyg274zaFO3GH0E0LBsHDW dUMo3Lj/orjcYqrfYfcgu+iCMlT60SizuUmQ0yXDf4iKgGwT8q304Km2WX0/PDv+l/NC DMfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; 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=w7TYkI/++FXvnkpoOiqybcbrgtqyZejgSKUe6dTILis=; b=ofZxzBVwSdoQNtiWzXwgP5KYle4qjhSBTLHbr6+u6rUG0jnkrSN0QMfw0H3NOiubkT A3qOP7uiQz34HaG/2eiPpSLMtfY6TWkF96RvgPLkZn9TUuM7OAHvV/3mXmdFYsAwWyNM NG74IjoOG0hJ51T5BcK32iUaJSQSH1Gvs8Vgt1VcU+nWkwykcwWPx5bYSMAGpFs/uNen ZCItC5B0Vy/CbkrPAjpTaghBdIFh3QH7FemfwXCwdoc5Dk0q37FNQsLnBoxqcKadK3Qm 8xGsvFXmMX9SqrBzCYdhNzJLRFcqCFWzmYq9JmOL8c+NAOgUco+Ovpxsl2FdfcwNmwPY N9AQ== X-Gm-Message-State: AO0yUKXOegaUdEQ37V7Et+IdOCK/Tk4in0C2A2Hr48kXhRrTIR3ysAUY JbFQWjETSkUxDD2reib1MWrTSHpwwbQ= X-Google-Smtp-Source: AK7set+9nWLV0d7TJAM78x3R2IOM15F+m8bznxMMejSoZ09Vit8Gk4m5L4HagNL5oLpbusBrS9hzHA== X-Received: by 2002:a17:906:4690:b0:87b:3d29:2982 with SMTP id a16-20020a170906469000b0087b3d292982mr25083076ejr.11.1676305247225; Mon, 13 Feb 2023 08:20:47 -0800 (PST) Received: from localhost.localdomain (dynamic-078-055-133-198.78.55.pool.telefonica.de. [78.55.133.198]) by smtp.gmail.com with ESMTPSA id 20-20020a170906025400b008841aa86484sm6979952ejl.211.2023.02.13.08.20.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Feb 2023 08:20:46 -0800 (PST) From: Bernhard Beschow To: qemu-devel@nongnu.org Cc: Paolo Bonzini , Sunil Muthuswamy , "Michael S. Tsirkin" , Marcel Apfelbaum , "Dr . David Alan Gilbert" , qemu-trivial@nongnu.org, Richard Henderson , Juan Quintela , Eduardo Habkost , Thomas Huth , Igor Mammedov , BALATON Zoltan , Ani Sinha , Laurent Vivier , Bernhard Beschow Subject: [PATCH v4 8/9] hw/i386/x86: Make TYPE_X86_MACHINE the owner of smram Date: Mon, 13 Feb 2023 17:20:03 +0100 Message-Id: <20230213162004.2797-9-shentey@gmail.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230213162004.2797-1-shentey@gmail.com> References: <20230213162004.2797-1-shentey@gmail.com> MIME-Version: 1.0 Received-SPF: pass client-ip=2a00:1450:4864:20::629; envelope-from=shentey@gmail.com; helo=mail-ej1-x629.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: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Treat the smram MemoryRegion analoguous to other memory regions such as ram, pci, io, ... , making the used memory regions more explicit when instantiating q35 or i440fx. Note that the q35 device uses these memory regions only during the realize phase which suggests that it shouldn't be the owner of smram. i440fx activates/deactivates the whole smram memory region depending on the SMRAM_G_SMRAME bit which seems wrong since it should only handle the 128kb region. If this got changed, i440fx would also only use smram during its realize phase. Signed-off-by: Bernhard Beschow --- include/hw/i386/x86.h | 2 ++ include/hw/pci-host/i440fx.h | 7 ++++--- include/hw/pci-host/q35.h | 4 +++- hw/i386/pc_piix.c | 2 +- hw/i386/pc_q35.c | 2 ++ hw/i386/x86.c | 4 ++++ hw/pci-host/i440fx.c | 13 +++++-------- hw/pci-host/q35.c | 17 ++++++++--------- 8 files changed, 29 insertions(+), 22 deletions(-) diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h index 62fa5774f8..ba6912b721 100644 --- a/include/hw/i386/x86.h +++ b/include/hw/i386/x86.h @@ -59,6 +59,8 @@ struct X86MachineState { /* Start address of the initial RAM above 4G */ uint64_t above_4g_mem_start; + MemoryRegion smram; + /* CPU and apic information: */ bool apic_xrupt_override; unsigned pci_irq_mask; diff --git a/include/hw/pci-host/i440fx.h b/include/hw/pci-host/i440fx.h index bf57216c78..e9efdb3c5f 100644 --- a/include/hw/pci-host/i440fx.h +++ b/include/hw/pci-host/i440fx.h @@ -28,9 +28,10 @@ struct PCII440FXState { MemoryRegion *system_memory; MemoryRegion *pci_address_space; MemoryRegion *ram_memory; + MemoryRegion *smram; PAMMemoryRegion pam_regions[PAM_REGIONS_COUNT]; MemoryRegion smram_region; - MemoryRegion smram, low_smram; + MemoryRegion low_smram; }; #define TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "igd-passthrough-i440FX" @@ -43,7 +44,7 @@ PCIBus *i440fx_init(const char *pci_type, ram_addr_t below_4g_mem_size, ram_addr_t above_4g_mem_size, MemoryRegion *pci_memory, - MemoryRegion *ram_memory); - + MemoryRegion *ram_memory, + MemoryRegion *smram); #endif diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h index e89329c51e..fcbe57b42d 100644 --- a/include/hw/pci-host/q35.h +++ b/include/hw/pci-host/q35.h @@ -44,9 +44,10 @@ struct MCHPCIState { MemoryRegion *pci_address_space; MemoryRegion *system_memory; MemoryRegion *address_space_io; + MemoryRegion *smram; PAMMemoryRegion pam_regions[PAM_REGIONS_COUNT]; MemoryRegion smram_region, open_high_smram; - MemoryRegion smram, low_smram, high_smram; + MemoryRegion low_smram, high_smram; MemoryRegion tseg_blackhole, tseg_window; MemoryRegion smbase_blackhole, smbase_window; bool has_smram_at_smbase; @@ -75,6 +76,7 @@ struct Q35PCIHost { */ #define MCH_HOST_PROP_RAM_MEM "ram-mem" +#define MCH_HOST_PROP_SMRAM_MEM "smram-mem" #define MCH_HOST_PROP_PCI_MEM "pci-mem" #define MCH_HOST_PROP_SYSTEM_MEM "system-mem" #define MCH_HOST_PROP_IO_MEM "io-mem" diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c index 00ba725656..41aaaa5465 100644 --- a/hw/i386/pc_piix.c +++ b/hw/i386/pc_piix.c @@ -228,7 +228,7 @@ static void pc_init1(MachineState *machine, system_memory, system_io, machine->ram_size, x86ms->below_4g_mem_size, x86ms->above_4g_mem_size, - pci_memory, ram_memory); + pci_memory, ram_memory, &x86ms->smram); pci_bus_map_irqs(pci_bus, xen_enabled() ? xen_pci_slot_get_pirq : pc_pci_slot_get_pirq); diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c index 455cbe11fa..a5ffb77ed8 100644 --- a/hw/i386/pc_q35.c +++ b/hw/i386/pc_q35.c @@ -220,6 +220,8 @@ static void pc_q35_init(MachineState *machine) object_property_add_child(OBJECT(machine), "q35", OBJECT(q35_host)); object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_RAM_MEM, OBJECT(machine->ram), NULL); + object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_SMRAM_MEM, + OBJECT(&x86ms->smram), NULL); object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_PCI_MEM, OBJECT(pci_memory), NULL); object_property_set_link(OBJECT(q35_host), MCH_HOST_PROP_SYSTEM_MEM, diff --git a/hw/i386/x86.c b/hw/i386/x86.c index eaff4227bd..d7e219b1eb 100644 --- a/hw/i386/x86.c +++ b/hw/i386/x86.c @@ -1436,6 +1436,10 @@ static void x86_machine_initfn(Object *obj) x86ms->oem_table_id = g_strndup(ACPI_BUILD_APPNAME8, 8); x86ms->bus_lock_ratelimit = 0; x86ms->above_4g_mem_start = 4 * GiB; + + memory_region_init(&x86ms->smram, obj, "smram", 4 * GiB); + memory_region_set_enabled(&x86ms->smram, true); + object_property_add_const_link(obj, "smram", OBJECT(&x86ms->smram)); } static void x86_machine_class_init(ObjectClass *oc, void *data) diff --git a/hw/pci-host/i440fx.c b/hw/pci-host/i440fx.c index 61e7b97ff4..8f4a4f59a6 100644 --- a/hw/pci-host/i440fx.c +++ b/hw/pci-host/i440fx.c @@ -23,7 +23,6 @@ */ #include "qemu/osdep.h" -#include "qemu/units.h" #include "qemu/range.h" #include "hw/i386/pc.h" #include "hw/pci/pci.h" @@ -77,7 +76,7 @@ static void i440fx_update_memory_mappings(PCII440FXState *d) } memory_region_set_enabled(&d->smram_region, !(pd->config[I440FX_SMRAM] & SMRAM_D_OPEN)); - memory_region_set_enabled(&d->smram, + memory_region_set_enabled(d->smram, pd->config[I440FX_SMRAM] & SMRAM_G_SMRAME); memory_region_transaction_commit(); } @@ -246,7 +245,8 @@ PCIBus *i440fx_init(const char *pci_type, ram_addr_t below_4g_mem_size, ram_addr_t above_4g_mem_size, MemoryRegion *pci_address_space, - MemoryRegion *ram_memory) + MemoryRegion *ram_memory, + MemoryRegion *smram) { PCIBus *b; PCIDevice *d; @@ -267,6 +267,7 @@ PCIBus *i440fx_init(const char *pci_type, f->system_memory = address_space_mem; f->pci_address_space = pci_address_space; f->ram_memory = ram_memory; + f->smram = smram; i440fx = I440FX_PCI_HOST_BRIDGE(dev); range_set_bounds(&i440fx->pci_hole, below_4g_mem_size, @@ -283,14 +284,10 @@ PCIBus *i440fx_init(const char *pci_type, memory_region_set_enabled(&f->smram_region, true); /* smram, as seen by SMM CPUs */ - memory_region_init(&f->smram, OBJECT(d), "smram", 4 * GiB); - memory_region_set_enabled(&f->smram, true); memory_region_init_alias(&f->low_smram, OBJECT(d), "smram-low", f->ram_memory, 0xa0000, 0x20000); memory_region_set_enabled(&f->low_smram, true); - memory_region_add_subregion(&f->smram, 0xa0000, &f->low_smram); - object_property_add_const_link(qdev_get_machine(), "smram", - OBJECT(&f->smram)); + memory_region_add_subregion(f->smram, 0xa0000, &f->low_smram); init_pam(&f->pam_regions[0], OBJECT(d), f->ram_memory, f->system_memory, f->pci_address_space, PAM_BIOS_BASE, PAM_BIOS_SIZE); diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c index fd18920e7f..83f2a98c71 100644 --- a/hw/pci-host/q35.c +++ b/hw/pci-host/q35.c @@ -246,6 +246,10 @@ static void q35_host_initfn(Object *obj) (Object **) &s->mch.ram_memory, qdev_prop_allow_set_link_before_realize, 0); + object_property_add_link(obj, MCH_HOST_PROP_SMRAM_MEM, TYPE_MEMORY_REGION, + (Object **) &s->mch.smram, + qdev_prop_allow_set_link_before_realize, 0); + object_property_add_link(obj, MCH_HOST_PROP_PCI_MEM, TYPE_MEMORY_REGION, (Object **) &s->mch.pci_address_space, qdev_prop_allow_set_link_before_realize, 0); @@ -594,19 +598,17 @@ static void mch_realize(PCIDevice *d, Error **errp) memory_region_set_enabled(&mch->open_high_smram, false); /* smram, as seen by SMM CPUs */ - memory_region_init(&mch->smram, OBJECT(mch), "smram", 4 * GiB); - memory_region_set_enabled(&mch->smram, true); memory_region_init_alias(&mch->low_smram, OBJECT(mch), "smram-low", mch->ram_memory, MCH_HOST_BRIDGE_SMRAM_C_BASE, MCH_HOST_BRIDGE_SMRAM_C_SIZE); memory_region_set_enabled(&mch->low_smram, true); - memory_region_add_subregion(&mch->smram, MCH_HOST_BRIDGE_SMRAM_C_BASE, + memory_region_add_subregion(mch->smram, MCH_HOST_BRIDGE_SMRAM_C_BASE, &mch->low_smram); memory_region_init_alias(&mch->high_smram, OBJECT(mch), "smram-high", mch->ram_memory, MCH_HOST_BRIDGE_SMRAM_C_BASE, MCH_HOST_BRIDGE_SMRAM_C_SIZE); memory_region_set_enabled(&mch->high_smram, true); - memory_region_add_subregion(&mch->smram, 0xfeda0000, &mch->high_smram); + memory_region_add_subregion(mch->smram, 0xfeda0000, &mch->high_smram); memory_region_init_io(&mch->tseg_blackhole, OBJECT(mch), &blackhole_ops, NULL, @@ -619,7 +621,7 @@ static void mch_realize(PCIDevice *d, Error **errp) memory_region_init_alias(&mch->tseg_window, OBJECT(mch), "tseg-window", mch->ram_memory, mch->below_4g_mem_size, 0); memory_region_set_enabled(&mch->tseg_window, false); - memory_region_add_subregion(&mch->smram, mch->below_4g_mem_size, + memory_region_add_subregion(mch->smram, mch->below_4g_mem_size, &mch->tseg_window); /* @@ -639,12 +641,9 @@ static void mch_realize(PCIDevice *d, Error **errp) MCH_HOST_BRIDGE_SMBASE_ADDR, MCH_HOST_BRIDGE_SMBASE_SIZE); memory_region_set_enabled(&mch->smbase_window, false); - memory_region_add_subregion(&mch->smram, MCH_HOST_BRIDGE_SMBASE_ADDR, + memory_region_add_subregion(mch->smram, MCH_HOST_BRIDGE_SMBASE_ADDR, &mch->smbase_window); - object_property_add_const_link(qdev_get_machine(), "smram", - OBJECT(&mch->smram)); - init_pam(&mch->pam_regions[0], OBJECT(mch), mch->ram_memory, mch->system_memory, mch->pci_address_space, PAM_BIOS_BASE, PAM_BIOS_SIZE);