From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>
Subject: [Qemu-devel] [PULL 59/62] q35: implement TSEG
Date: Fri, 5 Jun 2015 17:16:00 +0200 [thread overview]
Message-ID: <1433517363-32335-60-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1433517363-32335-1-git-send-email-pbonzini@redhat.com>
From: Gerd Hoffmann <kraxel@redhat.com>
TSEG provides larger amounts of SMRAM than the 128 KB available with
legacy SMRAM and high SMRAM.
Route access to tseg into nowhere when enabled, for both cpus and
busmaster dma, and add tseg window to smram region, so cpus can access
it in smm mode.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/pci-host/q35.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++
include/hw/pci-host/q35.h | 1 +
2 files changed, 71 insertions(+)
diff --git a/hw/pci-host/q35.c b/hw/pci-host/q35.c
index 305994b..bd74094 100644
--- a/hw/pci-host/q35.c
+++ b/hw/pci-host/q35.c
@@ -198,6 +198,28 @@ static const TypeInfo q35_host_info = {
* MCH D0:F0
*/
+static uint64_t tseg_blackhole_read(void *ptr, hwaddr reg, unsigned size)
+{
+ return 0xffffffff;
+}
+
+static void tseg_blackhole_write(void *opaque, hwaddr addr, uint64_t val,
+ unsigned width)
+{
+ /* nothing */
+}
+
+static const MemoryRegionOps tseg_blackhole_ops = {
+ .read = tseg_blackhole_read,
+ .write = tseg_blackhole_write,
+ .endianness = DEVICE_NATIVE_ENDIAN,
+ .valid.min_access_size = 1,
+ .valid.max_access_size = 4,
+ .impl.min_access_size = 4,
+ .impl.max_access_size = 4,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
/* PCIe MMCFG */
static void mch_update_pciexbar(MCHPCIState *mch)
{
@@ -267,6 +289,7 @@ static void mch_update_smram(MCHPCIState *mch)
{
PCIDevice *pd = PCI_DEVICE(mch);
bool h_smrame = (pd->config[MCH_HOST_BRIDGE_ESMRAMC] & MCH_HOST_BRIDGE_ESMRAMC_H_SMRAME);
+ uint32_t tseg_size;
/* implement SMRAM.D_LCK */
if (pd->config[MCH_HOST_BRIDGE_SMRAM] & MCH_HOST_BRIDGE_SMRAM_D_LCK) {
@@ -296,6 +319,39 @@ static void mch_update_smram(MCHPCIState *mch)
memory_region_set_enabled(&mch->high_smram, false);
}
+ if (pd->config[MCH_HOST_BRIDGE_ESMRAMC] & MCH_HOST_BRIDGE_ESMRAMC_T_EN) {
+ switch (pd->config[MCH_HOST_BRIDGE_ESMRAMC] &
+ MCH_HOST_BRIDGE_ESMRAMC_TSEG_SZ_MASK) {
+ case MCH_HOST_BRIDGE_ESMRAMC_TSEG_SZ_1MB:
+ tseg_size = 1024 * 1024;
+ break;
+ case MCH_HOST_BRIDGE_ESMRAMC_TSEG_SZ_2MB:
+ tseg_size = 1024 * 1024 * 2;
+ break;
+ case MCH_HOST_BRIDGE_ESMRAMC_TSEG_SZ_8MB:
+ tseg_size = 1024 * 1024 * 8;
+ break;
+ default:
+ tseg_size = 0;
+ break;
+ }
+ } else {
+ tseg_size = 0;
+ }
+ memory_region_del_subregion(mch->system_memory, &mch->tseg_blackhole);
+ memory_region_set_enabled(&mch->tseg_blackhole, tseg_size);
+ memory_region_set_size(&mch->tseg_blackhole, tseg_size);
+ memory_region_add_subregion_overlap(mch->system_memory,
+ mch->below_4g_mem_size - tseg_size,
+ &mch->tseg_blackhole, 1);
+
+ memory_region_set_enabled(&mch->tseg_window, tseg_size);
+ memory_region_set_size(&mch->tseg_window, tseg_size);
+ memory_region_set_address(&mch->tseg_window,
+ mch->below_4g_mem_size - tseg_size);
+ memory_region_set_alias_offset(&mch->tseg_window,
+ mch->below_4g_mem_size - tseg_size);
+
memory_region_transaction_commit();
}
@@ -443,6 +499,20 @@ static void mch_realize(PCIDevice *d, Error **errp)
mch->ram_memory, 0xa0000, 0x20000);
memory_region_set_enabled(&mch->high_smram, true);
memory_region_add_subregion(&mch->smram, 0xfeda0000, &mch->high_smram);
+
+ memory_region_init_io(&mch->tseg_blackhole, OBJECT(mch),
+ &tseg_blackhole_ops, NULL,
+ "tseg-blackhole", 0);
+ memory_region_set_enabled(&mch->tseg_blackhole, false);
+ memory_region_add_subregion_overlap(mch->system_memory,
+ mch->below_4g_mem_size,
+ &mch->tseg_blackhole, 1);
+
+ 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,
+ &mch->tseg_window);
object_property_add_const_link(qdev_get_machine(), "smram",
OBJECT(&mch->smram), &error_abort);
diff --git a/include/hw/pci-host/q35.h b/include/hw/pci-host/q35.h
index 113cbe8..dbe6dc0 100644
--- a/include/hw/pci-host/q35.h
+++ b/include/hw/pci-host/q35.h
@@ -54,6 +54,7 @@ typedef struct MCHPCIState {
PAMMemoryRegion pam_regions[13];
MemoryRegion smram_region, open_high_smram;
MemoryRegion smram, low_smram, high_smram;
+ MemoryRegion tseg_blackhole, tseg_window;
PcPciInfo pci_info;
ram_addr_t below_4g_mem_size;
ram_addr_t above_4g_mem_size;
--
2.4.1
next prev parent reply other threads:[~2015-06-05 15:17 UTC|newest]
Thread overview: 70+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-05 15:15 [Qemu-devel] [PULL 00/62] KVM, dirty bitmap, build system, SMM, icount changes for 2015-06-05 Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 01/62] Move parallel_hds_isa_init to hw/isa/isa-bus.c Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 02/62] ppc: add helpful message when KVM fails to start VCPU Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 03/62] qemu-nbd: Switch to qemu_set_fd_handler Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 04/62] exec: optimize phys_page_set_level Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 05/62] Makefile.target: set master BUILD_DIR Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 06/62] memory: the only dirty memory flag for users is DIRTY_MEMORY_VGA Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 07/62] g364fb: remove pointless call to memory_region_set_coalescing Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 08/62] display: enable DIRTY_MEMORY_VGA tracking explicitly Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 09/62] display: add memory_region_sync_dirty_bitmap calls Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 10/62] memory: differentiate memory_region_is_logging and memory_region_get_dirty_log_mask Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 11/62] memory: prepare for multiple bits in the dirty log mask Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 12/62] framebuffer: check memory_region_is_logging Paolo Bonzini
2015-07-10 15:44 ` Peter Maydell
2015-07-12 14:09 ` Paolo Bonzini
2015-07-12 22:02 ` Peter Maydell
2015-07-13 6:48 ` Paolo Bonzini
2015-07-13 8:55 ` Peter Maydell
2015-07-13 10:15 ` Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 13/62] ui/console: remove dpy_gfx_update_dirty Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 14/62] memory: track DIRTY_MEMORY_CODE in mr->dirty_log_mask Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 15/62] kvm: accept non-mapped memory in kvm_dirty_pages_log_change Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 16/62] memory: include DIRTY_MEMORY_MIGRATION in the dirty log mask Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 17/62] kvm: remove special handling of " Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 18/62] ram_addr: tweaks to xen_modified_memory Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 19/62] exec: use memory_region_get_dirty_log_mask to optimize dirty tracking Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 20/62] exec: move functions to translate-all.h Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 21/62] translate-all: remove unnecessary argument to tb_invalidate_phys_range Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 22/62] cputlb: remove useless arguments to tlb_unprotect_code_phys, rename Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 23/62] translate-all: make less of tb_invalidate_phys_page_range depend on is_cpu_write_access Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 24/62] exec: pass client mask to cpu_physical_memory_set_dirty_range Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 25/62] exec: invert return value of cpu_physical_memory_get_clean, rename Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 26/62] exec: only check relevant bitmaps for cleanliness Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 27/62] memory: do not touch code dirty bitmap unless TCG is enabled Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 28/62] bitmap: add atomic set functions Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 29/62] bitmap: add atomic test and clear Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 30/62] memory: use atomic ops for setting dirty memory bits Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 31/62] migration: move dirty bitmap sync to ram_addr.h Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 32/62] memory: replace cpu_physical_memory_reset_dirty() with test-and-clear Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 33/62] memory: make cpu_physical_memory_sync_dirty_bitmap() fully atomic Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 34/62] memory: use mr->ram_addr in "is this RAM?" assertions Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 35/62] icount: implement a new icount_sleep mode toggleing real-time cpu sleep Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 36/62] icount: add sleep parameter to the icount option to set icount_sleep mode Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 37/62] icount: print a warning if there is no more deadline in sleep=no mode Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 38/62] target-i386: introduce cpu_get_mem_attrs Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 39/62] target-i386: Use correct memory attributes for memory accesses Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 40/62] target-i386: Use correct memory attributes for ioport accesses Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 41/62] target-i386: mask NMIs on entry to SMM Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 42/62] target-i386: set G=1 in SMM big real mode selectors Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 43/62] target-i386: wake up processors that receive an SMI Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 44/62] pflash_cfi01: change big-endian property to BIT type Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 45/62] pflash_cfi01: change to new-style MMIO accessors Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 46/62] pflash_cfi01: add secure property Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 47/62] vl: allow full-blown QemuOpts syntax for -global Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 48/62] qom: add object_property_add_const_link Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 49/62] vl: run "late" notifiers immediately Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 50/62] target-i386: create a separate AddressSpace for each CPU Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 51/62] hw/i386: add a separate region that tracks the SMRAME bit Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 52/62] target-i386: use memory API to implement SMRAM Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 53/62] hw/i386: remove smram_update Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 54/62] q35: implement high SMRAM Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 55/62] q35: fix ESMRAMC default Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 56/62] q35: add config space wmask for SMRAM and ESMRAMC Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 57/62] q35: implement SMRAM.D_LCK Paolo Bonzini
2015-06-05 15:15 ` [Qemu-devel] [PULL 58/62] q35: add test for SMRAM.D_LCK Paolo Bonzini
2015-06-05 15:16 ` Paolo Bonzini [this message]
2015-06-05 15:16 ` [Qemu-devel] [PULL 60/62] ich9: implement SMI_LOCK Paolo Bonzini
2015-06-05 15:16 ` [Qemu-devel] [PULL 61/62] atomics: add explicit compiler fence in __atomic memory barriers Paolo Bonzini
2015-06-05 15:16 ` [Qemu-devel] [PULL 62/62] update Linux headers from kvm/next Paolo Bonzini
2015-06-05 15:30 ` [Qemu-devel] [PULL 00/62] KVM, dirty bitmap, build system, SMM, icount changes for 2015-06-05 Paolo Bonzini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1433517363-32335-60-git-send-email-pbonzini@redhat.com \
--to=pbonzini@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).