From patchwork Sun May 20 07:28:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zihan Yang X-Patchwork-Id: 917076 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Xbgrd0fU"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40pYXy6XsHz9s4b for ; Sun, 20 May 2018 17:33:06 +1000 (AEST) Received: from localhost ([::1]:45535 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fKIq0-0003sU-HY for incoming@patchwork.ozlabs.org; Sun, 20 May 2018 03:33:04 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:52363) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fKImZ-0001K0-65 for qemu-devel@nongnu.org; Sun, 20 May 2018 03:29:32 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fKImY-0006yf-3c for qemu-devel@nongnu.org; Sun, 20 May 2018 03:29:31 -0400 Received: from mail-pl0-x244.google.com ([2607:f8b0:400e:c01::244]:46372) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fKImX-0006yO-Rl for qemu-devel@nongnu.org; Sun, 20 May 2018 03:29:30 -0400 Received: by mail-pl0-x244.google.com with SMTP id 30-v6so6937671pld.13 for ; Sun, 20 May 2018 00:29:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sCIyPtABjdYZVS2dyc8BF8r272aSyTOAxlqSBWzMvHA=; b=Xbgrd0fUum2SkFQgyNCJSn4zrD1z9A36/sEEHKG+eha5BffUbTE8pmmRMBPpgZf6qD SL+CVNNUCUkYrCsFhyJNmZhDRPig8xOI6DKdDcwZRSACFen+QLozQSOMyTy4EpDKf+ls YxMP+ttO2+C7UhV18M63j60ypVMIy9ivxSLPfpqFVyxAAZu+tr+aVM/mgg7coPKOTSnd P9Z+GYwdb5+ohjVJsr6Or+o+zMpriZEZKsYrBMbUNUHPtEPGjZEa47GQBwUqN6S9Rolf 80Q8DOj37/JBwQUj2Zt7Q/MMrlvoPTNQb8qiJ7cpIddwteoqp88LfXj463fite2HgFL3 ba3w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=sCIyPtABjdYZVS2dyc8BF8r272aSyTOAxlqSBWzMvHA=; b=ExLk+SDIzCROfxChsA0MZFV+D9jzyWtyIWMv7JnsC8LreUc2ChG406JzV7VTJ1WgKf ND+mv6bakmXspCNm2AgUKwllOBtDaLEhWZuCMjh5JYD7oDoYOJu0q6dfI+6Bvcnt8oQE 4Ag0BY7SZuwvZI8eam+JAxCGwyYcpS+UGWwVprRL0SL5VOJrYghnFQGbOaq4T5izZ9I8 moyjApdA4tQfLK1e0tO4cMCtmkmJHyx8YKLnkFntPb89nDhEV13+/QcXMY/3krQ6LIF9 /T+9i0tcRKpX1z7TskmTMKPix3wT0SvVDSizhP+o8g7nX2dolSyGWjj66P/TvR5MlZg9 uPqw== X-Gm-Message-State: ALKqPwch3kurHH6E9Bm8bV0bbfixDZiA46pLRMcXOiiu2VRGTRtQk51g OLAZ5T6lMw2Xkf0OMRtxRe3zpBpp X-Google-Smtp-Source: AB8JxZoxIg/RSmI35BJaAuGNcQk4SEC1be5Hm9vln9vJgpchpAHY3Eyj2yxmhCRCBlmM1YIXffS92g== X-Received: by 2002:a17:902:125:: with SMTP id 34-v6mr16384501plb.42.1526801368702; Sun, 20 May 2018 00:29:28 -0700 (PDT) Received: from biggerfish-TM1701.lan ([203.69.105.4]) by smtp.gmail.com with ESMTPSA id j3-v6sm17338975pgs.76.2018.05.20.00.29.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 20 May 2018 00:29:27 -0700 (PDT) From: Zihan Yang To: qemu-devel@nongnu.org Date: Sun, 20 May 2018 15:28:53 +0800 Message-Id: <1526801333-30613-4-git-send-email-whois.zihan.yang@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1526801333-30613-1-git-send-email-whois.zihan.yang@gmail.com> References: <1526801333-30613-1-git-send-email-whois.zihan.yang@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c01::244 Subject: [Qemu-devel] [RFC 3/3] acpi-build: allocate mcfg for multiple host bridges X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Eduardo Habkost , Zihan Yang , "Michael S. Tsirkin" , Paolo Bonzini , Igor Mammedov , Richard Henderson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Currently only q35 host bridge us allocated space in MCFG table. To put pxb host into sepratate pci domain, each of them should have its own configuration space int MCFG table Signed-off-by: Zihan Yang --- hw/i386/acpi-build.c | 83 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 21 deletions(-) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 9bc6d97..808d815 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -89,6 +89,7 @@ typedef struct AcpiMcfgInfo { uint64_t mcfg_base; uint32_t mcfg_size; + struct AcpiMcfgInfo *next; } AcpiMcfgInfo; typedef struct AcpiPmInfo { @@ -2427,14 +2428,15 @@ build_mcfg_q35(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info) { AcpiTableMcfg *mcfg; const char *sig; - int len = sizeof(*mcfg) + 1 * sizeof(mcfg->allocation[0]); + int len, count = 0; + AcpiMcfgInfo *cfg = info; + while (cfg) { + ++count; + cfg = cfg->next; + } + len = sizeof(*mcfg) + count * sizeof(mcfg->allocation[0]); mcfg = acpi_data_push(table_data, len); - mcfg->allocation[0].address = cpu_to_le64(info->mcfg_base); - /* Only a single allocation so no need to play with segments */ - mcfg->allocation[0].pci_segment = cpu_to_le16(0); - mcfg->allocation[0].start_bus_number = 0; - mcfg->allocation[0].end_bus_number = PCIE_MMCFG_BUS(info->mcfg_size - 1); /* MCFG is used for ECAM which can be enabled or disabled by guest. * To avoid table size changes (which create migration issues), @@ -2448,6 +2450,17 @@ build_mcfg_q35(GArray *table_data, BIOSLinker *linker, AcpiMcfgInfo *info) } else { sig = "MCFG"; } + + count = 0; + while (info) { + mcfg[count].allocation[0].address = cpu_to_le64(info->mcfg_base); + /* Only a single allocation so no need to play with segments */ + mcfg[count].allocation[0].pci_segment = cpu_to_le16(count); + mcfg[count].allocation[0].start_bus_number = 0; + mcfg[count++].allocation[0].end_bus_number = PCIE_MMCFG_BUS(info->mcfg_size - 1); + info = info->next; + } + build_header(linker, table_data, (void *)mcfg, sig, len, 1, NULL, NULL); } @@ -2602,26 +2615,52 @@ struct AcpiBuildState { MemoryRegion *linker_mr; } AcpiBuildState; -static bool acpi_get_mcfg(AcpiMcfgInfo *mcfg) +static inline void cleanup_mcfg(AcpiMcfgInfo *mcfg) +{ + AcpiMcfgInfo *tmp; + while (mcfg) { + tmp = mcfg->next; + g_free(mcfg); + mcfg = tmp; + } +} + +static AcpiMcfgInfo *acpi_get_mcfg(void) { Object *pci_host; QObject *o; + AcpiMcfgInfo *head = NULL, *tail, *mcfg; pci_host = acpi_get_i386_pci_host(); g_assert(pci_host); - o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_BASE, NULL); - if (!o) { - return false; + while (pci_host) { + mcfg = g_new0(AcpiMcfgInfo, 1); + mcfg->next = NULL; + if (!head) { + tail = head = mcfg; + } else { + tail->next = mcfg; + tail = mcfg; + } + + o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_BASE, NULL); + if (!o) { + cleanup_mcfg(head); + g_free(mcfg); + return NULL; + } + mcfg->mcfg_base = qnum_get_uint(qobject_to(QNum, o)); + qobject_unref(o); + + o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL); + assert(o); + mcfg->mcfg_size = qnum_get_uint(qobject_to(QNum, o)); + qobject_unref(o); + + pci_host = OBJECT(QTAILQ_NEXT(PCI_HOST_BRIDGE(pci_host), next)); } - mcfg->mcfg_base = qnum_get_uint(qobject_to(QNum, o)); - qobject_unref(o); - - o = object_property_get_qobject(pci_host, PCIE_HOST_MCFG_SIZE, NULL); - assert(o); - mcfg->mcfg_size = qnum_get_uint(qobject_to(QNum, o)); - qobject_unref(o); - return true; + return head; } static @@ -2633,7 +2672,7 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) unsigned facs, dsdt, rsdt, fadt; AcpiPmInfo pm; AcpiMiscInfo misc; - AcpiMcfgInfo mcfg; + AcpiMcfgInfo *mcfg; Range pci_hole, pci_hole64; uint8_t *u; size_t aml_len = 0; @@ -2714,10 +2753,12 @@ void acpi_build(AcpiBuildTables *tables, MachineState *machine) build_slit(tables_blob, tables->linker); } } - if (acpi_get_mcfg(&mcfg)) { + if ((mcfg = acpi_get_mcfg()) != NULL) { acpi_add_table(table_offsets, tables_blob); - build_mcfg_q35(tables_blob, tables->linker, &mcfg); + build_mcfg_q35(tables_blob, tables->linker, mcfg); } + cleanup_mcfg(mcfg); + if (x86_iommu_get_default()) { IommuType IOMMUType = x86_iommu_get_type(); if (IOMMUType == TYPE_AMD) {