From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C66A0C4361B for ; Fri, 18 Dec 2020 06:04:16 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 499732388E for ; Fri, 18 Dec 2020 06:04:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 499732388E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:50772 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kq8sB-0007wf-3Y for qemu-devel@archiver.kernel.org; Fri, 18 Dec 2020 01:04:15 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:50904) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kq8ka-0008WU-4h for qemu-devel@nongnu.org; Fri, 18 Dec 2020 00:56:24 -0500 Received: from szxga04-in.huawei.com ([45.249.212.190]:2897) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kq8kV-0000Ns-54 for qemu-devel@nongnu.org; Fri, 18 Dec 2020 00:56:23 -0500 Received: from DGGEMS413-HUB.china.huawei.com (unknown [172.30.72.58]) by szxga04-in.huawei.com (SkyGuard) with ESMTP id 4Cxyl81m2wz15c8f; Fri, 18 Dec 2020 13:55:32 +0800 (CST) Received: from [10.174.184.155] (10.174.184.155) by DGGEMS413-HUB.china.huawei.com (10.3.19.213) with Microsoft SMTP Server id 14.3.498.0; Fri, 18 Dec 2020 13:56:05 +0800 Subject: Re: [PATCH] acpi/gpex: Inform os to keep firmware resource map To: "Michael S. Tsirkin" References: <20201217132926.4812-1-cenjiahui@huawei.com> <20201217132844-mutt-send-email-mst@kernel.org> From: Jiahui Cen Message-ID: <32c6419d-2d02-abfd-b283-bd39e4dc85fa@huawei.com> Date: Fri, 18 Dec 2020 13:56:05 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <20201217132844-mutt-send-email-mst@kernel.org> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [10.174.184.155] X-CFilter-Loop: Reflected Received-SPF: pass client-ip=45.249.212.190; envelope-from=cenjiahui@huawei.com; helo=szxga04-in.huawei.com X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, NICE_REPLY_A=-0.001, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: xieyingtai@huawei.com, Igor Mammedov , qemu-devel@nongnu.org, Gerd Hoffmann Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" Hi Michael, On 2020/12/18 2:29, Michael S. Tsirkin wrote: > On Thu, Dec 17, 2020 at 09:29:26PM +0800, Jiahui Cen wrote: >> There may be some differences in pci resource assignment between guest os >> and firmware. >> >> Eg. A Bridge with Bus [d2] >> -+-[0000:d2]---01.0-[d3]----01.0 >> >> where [d2:01.00] is a pcie-pci-bridge with BAR0 (mem, 64-bit, non-pref) [size=256] >> [d3:01.00] is a PCI Device with BAR0 (mem, 64-bit, pref) [size=128K] >> BAR4 (mem, 64-bit, pref) [size=64M] >> >> In EDK2, the Resource Map would be: >> PciBus: Resource Map for Bridge [D2|01|00] >> Type = PMem64; Base = 0x8004000000; Length = 0x4100000; Alignment = 0x3FFFFFF >> Base = 0x8004000000; Length = 0x4000000; Alignment = 0x3FFFFFF; Owner = PCI [D3|01|00:20] >> Base = 0x8008000000; Length = 0x20000; Alignment = 0x1FFFF; Owner = PCI [D3|01|00:10] >> Type = Mem64; Base = 0x8008100000; Length = 0x100; Alignment = 0xFFF >> >> While in Linux, kernel will use 0x2FFFFFF as the alignment to calculate >> the PMem64 size, which would be 0x6000000. Sorry, I made a mistake. Kernel will use 0x1FFFFFF (the half of 0x3FFFFFF) not 0x2FFFFFF as alignment, so the size 0x4100000 would be aligned to 0x6000000. >> >> The diffences could result in resource assignment failure. > > A bit more data here please. When does this result in a failure? > EDK2 would use 0x4100000 to calculate the root bus's PMem64 resource window, while Kernel would try to allocate 0x6000000 from the PMem64 resource window. Since the resource window is not large enough, the allocation would fail. Is this clear enough? I would add this into my next patch. Thanks, Jiahui >> Using _DSM #5 method to inform guest os not to ignore the PCI configuration >> that firmware has done at boot time could handle the differences. >> >> Signed-off-by: Jiahui Cen >> --- >> hw/pci-host/gpex-acpi.c | 11 ++++++++++- >> 1 file changed, 10 insertions(+), 1 deletion(-) >> >> diff --git a/hw/pci-host/gpex-acpi.c b/hw/pci-host/gpex-acpi.c >> index 071aa11b5c..2b490f3379 100644 >> --- a/hw/pci-host/gpex-acpi.c >> +++ b/hw/pci-host/gpex-acpi.c >> @@ -112,10 +112,19 @@ static void acpi_dsdt_add_pci_osc(Aml *dev) >> UUID = aml_touuid("E5C937D0-3553-4D7A-9117-EA4D19C3434D"); >> ifctx = aml_if(aml_equal(aml_arg(0), UUID)); >> ifctx1 = aml_if(aml_equal(aml_arg(2), aml_int(0))); >> - uint8_t byte_list[1] = {1}; >> + uint8_t byte_list[1] = {0x21}; >> buf = aml_buffer(1, byte_list); >> aml_append(ifctx1, aml_return(buf)); >> aml_append(ifctx, ifctx1); >> + >> + /* PCI Firmware Specification 3.2 >> + * 4.6.5. _DSM for Ignoring PCI Boot Configurations >> + * The UUID in _DSM in this context is >> + * {E5C937D0-3553-4D7A-9117-EA4D19C3434D} >> + */ >> + ifctx1 = aml_if(aml_equal(aml_arg(2), aml_int(5))); >> + aml_append(ifctx1, aml_return(aml_int(0))); >> + aml_append(ifctx, ifctx1); >> aml_append(method, ifctx); >> >> byte_list[0] = 0; >> -- >> 2.28.0 > > . >