From patchwork Wed Aug 9 20:34:08 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "lan,Tianyu" X-Patchwork-Id: 9892667 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 11A9A60236 for ; Thu, 10 Aug 2017 02:44:15 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B90E27CF9 for ; Thu, 10 Aug 2017 02:44:14 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0AF9628521; Thu, 10 Aug 2017 02:44:14 +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=-2.7 required=2.0 tests=BAYES_00, DATE_IN_PAST_06_12, 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 9AEC128384 for ; Thu, 10 Aug 2017 02:44:13 +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 1dfdPc-000153-23; Thu, 10 Aug 2017 02:41:28 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1dfdPa-00013s-HJ for xen-devel@lists.xen.org; Thu, 10 Aug 2017 02:41:26 +0000 Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id 13/F8-01736-5D7CB895; Thu, 10 Aug 2017 02:41:25 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrNLMWRWlGSWpSXmKPExsVywNwkQvfq8e5 Ig+fruS2WfFzM4sDocXT3b6YAxijWzLyk/IoE1oye3RfYCjYpVnzbdY69gfGjVBcjF4eQwDRG iTuf/7N1MXJySAjwShxZNoMVwvaXeL3nKxtEUQejxOsND8ASbALqEicWT2QEsUUEpCWufb7MC FLELHCVUeL0tvnMXYwcHMICIRKrepVBalgEVCX61rSzgNi8Ai4Sr79eZoFYoCAx5eF7ZhCbU8 BVYuqWrUwgthBQzbrl0xgnMPIuYGRYxahRnFpUllqka2iil1SUmZ5RkpuYmaNraGCql5taXJy YnpqTmFSsl5yfu4kRGBAMQLCD8expz0OMkhxMSqK8HQ3dkUJ8SfkplRmJxRnxRaU5qcWHGGU4 OJQkeFmAASYkWJSanlqRlpkDDE2YtAQHj5II7/tjQGne4oLE3OLMdIjUKUZdjlcT/n9jEmLJy 89LlRLnXQJSJABSlFGaBzcCFieXGGWlhHkZgY4S4ilILcrNLEGVf8UozsGoJMy7BWQKT2ZeCd ymV0BHMAEdEeHbCXJESSJCSqqBUarAvu1LQ/7R3Tm3Ntl4JN8zMzgxRTf46gXJwstBrf+tJPK XtcmncLBOvmrPIndxPpeQXqD61nK1gPSXRnuPnHtceEIpSMpdOt+g9dlmO+nqK8Lz7xUI6Gv/ vNfnr8hro3asf4bhGSE/uwUlZ99xytyU8dxbwhW34vvpy0/f9SzYGsXwO05SiaU4I9FQi7moO BEAYA4tzY4CAAA= X-Env-Sender: tianyu.lan@intel.com X-Msg-Ref: server-4.tower-206.messagelabs.com!1502332882!106576436!1 X-Originating-IP: [192.55.52.88] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTkyLjU1LjUyLjg4ID0+IDM3NDcyNQ==\n X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 5231 invoked from network); 10 Aug 2017 02:41:24 -0000 Received: from mga01.intel.com (HELO mga01.intel.com) (192.55.52.88) by server-4.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 10 Aug 2017 02:41:24 -0000 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Aug 2017 19:41:22 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.41,349,1498546800"; d="scan'208";a="121898888" Received: from sky-ws.sh.intel.com (HELO localhost) ([10.239.48.141]) by orsmga002.jf.intel.com with ESMTP; 09 Aug 2017 19:41:20 -0700 From: Lan Tianyu To: xen-devel@lists.xen.org Date: Wed, 9 Aug 2017 16:34:08 -0400 Message-Id: <1502310866-10450-8-git-send-email-tianyu.lan@intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1502310866-10450-1-git-send-email-tianyu.lan@intel.com> References: <1502310866-10450-1-git-send-email-tianyu.lan@intel.com> Cc: Lan Tianyu , kevin.tian@intel.com, wei.liu2@citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, julien.grall@arm.com, jbeulich@suse.com, Chao Gao Subject: [Xen-devel] [PATCH V2 7/25] tools/libacpi: Add new fields in acpi_config for 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. New fields are introduces for DMAR table. These new fields are set by toolstack through parsing guest's config file. construct_dmar() is added to build DMAR table according to the new fields. Signed-off-by: Chao Gao Signed-off-by: Lan Tianyu --- tools/libacpi/build.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ tools/libacpi/libacpi.h | 9 ++++++++ 2 files changed, 66 insertions(+) diff --git a/tools/libacpi/build.c b/tools/libacpi/build.c index f9881c9..c7cc784 100644 --- a/tools/libacpi/build.c +++ b/tools/libacpi/build.c @@ -28,6 +28,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)) @@ -303,6 +307,59 @@ static struct acpi_20_slit *construct_slit(struct acpi_ctxt *ctxt, return slit; } +/* + * Only one DMA remapping hardware unit is exposed and all devices + * are under the remapping hardware unit. I/O APIC should be explicitly + * enumerated. + */ +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; + if ( config->iommu_intremap_supported ) + dmar->flags = ACPI_DMAR_INTR_REMAP; + if ( !config->iommu_x2apic_supported ) + dmar->flags |= ACPI_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->base_address = config->iommu_base_addr; + + scope = &drhd->scope[0]; + scope->type = ACPI_DMAR_DEVICE_SCOPE_IOAPIC; + scope->length = ioapic_scope_size; + scope->enumeration_id = config->ioapic_id; + 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 2ed1ecf..74778a5 100644 --- a/tools/libacpi/libacpi.h +++ b/tools/libacpi/libacpi.h @@ -20,6 +20,8 @@ #ifndef __LIBACPI_H__ #define __LIBACPI_H__ +#include + #define ACPI_HAS_COM1 (1<<0) #define ACPI_HAS_COM2 (1<<1) #define ACPI_HAS_LPT1 (1<<2) @@ -96,8 +98,15 @@ struct acpi_config { uint32_t ioapic_base_address; uint16_t pci_isa_irq_mask; uint8_t ioapic_id; + + /* Emulated IOMMU features and location */ + bool iommu_intremap_supported; + bool iommu_x2apic_supported; + uint64_t iommu_base_addr; }; +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__ */