From patchwork Fri Mar 17 11:27:07 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "lan,Tianyu" X-Patchwork-Id: 9630451 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 8AB3260249 for ; Fri, 17 Mar 2017 11:37:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 533202862B for ; Fri, 17 Mar 2017 11:37:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4811A28644; Fri, 17 Mar 2017 11:37:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A49DF2862B for ; Fri, 17 Mar 2017 11:37:46 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coqAD-0003le-SY; Fri, 17 Mar 2017 11:35:21 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coqAC-0003jb-Do for xen-devel@lists.xen.org; Fri, 17 Mar 2017 11:35:20 +0000 Received: from [85.158.143.35] by server-8.bemta-6.messagelabs.com id BB/84-21675-7F9CBC85; Fri, 17 Mar 2017 11:35:19 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrNLMWRWlGSWpSXmKPExsVywNxEW/fbydM RBkuPmlos+biYxYHR4+ju30wBjFGsmXlJ+RUJrBlXNqUVzFGt2D5nI3MDY5tcFyMnh5BAhcTf c2vYQGwJAV6JI8tmsELYfhLX+qcxdjFyAdX0M0q8PXqcBSTBJqAucWLxREYQW0RAWuLa58tgN rPAdEaJL18tQGxhgSiJ3iffwQaxCKhKfL1+iBnE5hVwkfh67DZQnANogYLEnEk2IGFOAVeJu2 0P2CHucZG413WFZQIj7wJGhlWM6sWpRWWpRbqWeklFmekZJbmJmTm6hgZmermpxcWJ6ak5iUn Fesn5uZsYgYHAAAQ7GO9uCjjEKMnBpCTK+2LF6QghvqT8lMqMxOKM+KLSnNTiQ4wyHBxKErx3 TgDlBItS01Mr0jJzgCEJk5bg4FES4bUDSfMWFyTmFmemQ6ROMSpKifP2gyQEQBIZpXlwbbA4u MQoKyXMywh0iBBPQWpRbmYJqvwrRnEORiVh3mUgU3gy80rgpr8CWswEtPjthxMgi0sSEVJSDY xiBVbblk2IWm23dbayrdebaI/1D2oXNd1pbP7Fr6ZZP80rhnOl2cfSokCV51ZMiw4GOrTvl+B bvP1NrU9ERKOTyvILXDFup9/lv5oZEnI4vN9yDcfuFu69C2+fXsgq+71hS8CHowaXe7dduJra fOeG6CbhgNLcg07K+865GTzs/3XqdbrKzI9KLMUZiYZazEXFiQD2V79OfgIAAA== X-Env-Sender: tianyu.lan@intel.com X-Msg-Ref: server-2.tower-21.messagelabs.com!1489750515!48886643!2 X-Originating-IP: [192.55.52.43] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 20799 invoked from network); 17 Mar 2017 11:35:18 -0000 Received: from mga05.intel.com (HELO mga05.intel.com) (192.55.52.43) by server-2.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 17 Mar 2017 11:35:18 -0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga105.fm.intel.com with ESMTP; 17 Mar 2017 04:35:17 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,176,1486454400"; d="scan'208";a="61627878" Received: from lantianyu-ws.sh.intel.com (HELO localhost) ([10.239.159.159]) by orsmga002.jf.intel.com with ESMTP; 17 Mar 2017 04:35:15 -0700 From: Lan Tianyu To: xen-devel@lists.xen.org Date: Fri, 17 Mar 2017 19:27:07 +0800 Message-Id: <1489750043-17260-8-git-send-email-tianyu.lan@intel.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1489750043-17260-1-git-send-email-tianyu.lan@intel.com> References: <1489750043-17260-1-git-send-email-tianyu.lan@intel.com> Cc: Lan Tianyu , kevin.tian@intel.com, wei.liu2@citrix.com, ian.jackson@eu.citrix.com, jbeulich@suse.com, chao.gao@intel.com Subject: [Xen-devel] [RFC PATCH 7/23] Tools/libacpi: Add new fields in acpi_config to build DMAR table X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP From: Chao Gao The BIOS reports the remapping hardware units in a platform to system software through the DMA Remapping Reporting (DMAR) ACPI table. To build DMAR table during domain construction, two fields are added to struct acpi_config. One is dmar_flag which indicates whether interrupt remapping is supported and whether enabling X2APIC mode is premitted. The other is the base address of remapping hardware register-set for a remapping unit. Also, a function construct_dmar() is added to build DMAR table according the two fields. Note that we don't add a ACPI_HAS_DMAR table flag there for DMAR table will be only built for HVM guest in this version. But several fields of DMAR table is better to be determined during domain creation rather than compiling tool stack. Signed-off-by: Chao Gao Signed-off-by: Lan Tianyu --- tools/libacpi/build.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ tools/libacpi/libacpi.h | 11 ++++++++++ 2 files changed, 64 insertions(+) diff --git a/tools/libacpi/build.c b/tools/libacpi/build.c index a02ffbf..89a3c6c 100644 --- a/tools/libacpi/build.c +++ b/tools/libacpi/build.c @@ -27,6 +27,10 @@ #define ACPI_MAX_SECONDARY_TABLES 16 +#define VTD_HOST_ADDRESS_WIDTH 39 +#define I440_PSEUDO_BUS_PLATFORM 0xff +#define I440_PSEUDO_DEVFN_IOAPIC 0x0 + #define align16(sz) (((sz) + 15) & ~15) #define fixed_strcpy(d, s) strncpy((d), (s), sizeof(d)) @@ -302,6 +306,55 @@ static struct acpi_20_slit *construct_slit(struct acpi_ctxt *ctxt, return slit; } +struct acpi_dmar *construct_dmar(struct acpi_ctxt *ctxt, + const struct acpi_config *config) +{ + struct acpi_dmar *dmar; + struct acpi_dmar_hardware_unit *drhd; + struct dmar_device_scope *scope; + unsigned int size; + unsigned int ioapic_scope_size = sizeof(*scope) + sizeof(scope->path[0]); + + size = sizeof(*dmar) + sizeof(*drhd) + ioapic_scope_size; + + dmar = ctxt->mem_ops.alloc(ctxt, size, 16); + if ( !dmar ) + return NULL; + + memset(dmar, 0, size); + dmar->header.signature = ACPI_2_0_DMAR_SIGNATURE; + dmar->header.revision = ACPI_2_0_DMAR_REVISION; + dmar->header.length = size; + fixed_strcpy(dmar->header.oem_id, ACPI_OEM_ID); + fixed_strcpy(dmar->header.oem_table_id, ACPI_OEM_TABLE_ID); + dmar->header.oem_revision = ACPI_OEM_REVISION; + dmar->header.creator_id = ACPI_CREATOR_ID; + dmar->header.creator_revision = ACPI_CREATOR_REVISION; + dmar->host_address_width = VTD_HOST_ADDRESS_WIDTH - 1; + dmar->flags = config->dmar_flag & (DMAR_INTR_REMAP|DMAR_X2APIC_OPT_OUT); + + drhd = (struct acpi_dmar_hardware_unit *)((void*)dmar + sizeof(*dmar)); + drhd->type = ACPI_DMAR_TYPE_HARDWARE_UNIT; + drhd->length = sizeof(*drhd) + ioapic_scope_size; + drhd->flags = ACPI_DMAR_INCLUDE_PCI_ALL; + drhd->pci_segment = 0; + drhd->address = config->viommu_base_addr; + + scope = &drhd->scope[0]; + scope->type = ACPI_DMAR_DEVICE_SCOPE_IOAPIC; + scope->length = ioapic_scope_size; + /* + * This field provides the I/O APICID as provided in the I/O APIC structure + * in the ACPI MADT (Multiple APIC Descriptor Table). + */ + scope->enumeration_id = 1; + scope->bus = I440_PSEUDO_BUS_PLATFORM; + scope->path[0] = I440_PSEUDO_DEVFN_IOAPIC; + + set_checksum(dmar, offsetof(struct acpi_header, checksum), size); + return dmar; +} + static int construct_passthrough_tables(struct acpi_ctxt *ctxt, unsigned long *table_ptrs, int nr_tables, diff --git a/tools/libacpi/libacpi.h b/tools/libacpi/libacpi.h index 67bd67f..ee08c45 100644 --- a/tools/libacpi/libacpi.h +++ b/tools/libacpi/libacpi.h @@ -20,6 +20,8 @@ #ifndef __LIBACPI_H__ #define __LIBACPI_H__ +#include "acpi2_0.h" + #define ACPI_HAS_COM1 (1<<0) #define ACPI_HAS_COM2 (1<<1) #define ACPI_HAS_LPT1 (1<<2) @@ -35,6 +37,7 @@ #define ACPI_HAS_VGA (1<<12) #define ACPI_HAS_8042 (1<<13) #define ACPI_HAS_CMOS_RTC (1<<14) +#define ACPI_HAS_DMAR (1<<15) struct xen_vmemrange; struct acpi_numa { @@ -95,8 +98,16 @@ struct acpi_config { uint32_t ioapic_base_address; uint16_t pci_isa_irq_mask; uint8_t ioapic_id; + + /* dmar info */ + uint8_t dmar_flag; + uint64_t viommu_base_addr; }; +#define DMAR_INTR_REMAP 0x1 +#define DMAR_X2APIC_OPT_OUT 0x2 +struct acpi_dmar *construct_dmar(struct acpi_ctxt *ctxt, + const struct acpi_config *config); int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config); #endif /* __LIBACPI_H__ */