From nobody Mon Mar 23 21:28:12 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; dkim=pass header.i=thierry.escande@vates.tech; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass(p=none dis=none) header.from=vates.tech ARC-Seal: i=1; a=rsa-sha256; t=1773419739; cv=none; d=zohomail.com; s=zohoarc; b=R59haZ7Uu7giNEsVAadLEtNYlAxeJnZr7s/DMWYxu+KfmzsmuyAlte7hXb0ImWgHhL8PZxMC1NP0fU8Ac9gq+DbFo7nKAqCVkILql3KODi4gZly09yneGY6fMVjDQRsPxJq/vdit7MgP8UGW8v9pZ/A/wNI1Z5m2/zwCVZYwMYI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1773419739; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=vBvMj1s8yDbIqTjPGPxPkkkz4nmbCVdKzy+th6j4Qis=; b=lPkQ3DWSRfVa0vr5kCliSg0z/7H7hnJz5bOoDOjxxymTEQUw+a38ppJ/B0VlMMJUrPhKhZPyMkc2zwyVf0ZPtVvdkfn9IRWsDURq03HHnJfMgMOEjin+rSL9YAid4No3U7t4e3G+nwg/cfadkqvbjZUvU+/v0ymFeYA8es2QASw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass header.i=thierry.escande@vates.tech; spf=pass (zohomail.com: domain of lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1773419739305476.1749540722187; Fri, 13 Mar 2026 09:35:39 -0700 (PDT) Received: from list by lists.xenproject.org with outflank-mailman.1253917.1549943 (Exim 4.92) (envelope-from ) id 1w15Tn-0008Uu-D0; Fri, 13 Mar 2026 16:35:15 +0000 Received: by outflank-mailman (output) from mailman id 1253917.1549943; Fri, 13 Mar 2026 16:35:15 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w15Tn-0008SY-7u; Fri, 13 Mar 2026 16:35:15 +0000 Received: by outflank-mailman (input) for mailman id 1253917; Fri, 13 Mar 2026 16:35:13 +0000 Received: from se1-gles-flk1-in.inumbo.com ([94.247.172.50] helo=se1-gles-flk1.inumbo.com) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1w15Tl-0006Ek-Nd for xen-devel@lists.xenproject.org; Fri, 13 Mar 2026 16:35:13 +0000 Received: from mail134-15.atl141.mandrillapp.com (mail134-15.atl141.mandrillapp.com [198.2.134.15]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 9798a939-1efa-11f1-9ccf-f158ae23cfc8; Fri, 13 Mar 2026 17:35:06 +0100 (CET) Received: from pmta10.mandrill.prod.atl01.rsglab.com (localhost [127.0.0.1]) by mail134-15.atl141.mandrillapp.com (Mailchimp) with ESMTP id 4fXVT35JmGzPm0V3V for ; Fri, 13 Mar 2026 16:35:03 +0000 (GMT) Received: from [37.26.189.201] by mandrillapp.com id 977f1deb1d244fa8b6af82292b76ac72; Fri, 13 Mar 2026 16:35:03 +0000 X-Outflank-Mailman: Message body and most headers restored to incoming version X-BeenThere: xen-devel@lists.xenproject.org List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Precedence: list Sender: "Xen-devel" X-Inumbo-ID: 9798a939-1efa-11f1-9ccf-f158ae23cfc8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mandrillapp.com; s=mte1; t=1773419703; x=1773689703; bh=vBvMj1s8yDbIqTjPGPxPkkkz4nmbCVdKzy+th6j4Qis=; h=From:Subject:To:Cc:Message-Id:In-Reply-To:References:Feedback-ID: Date:MIME-Version:Content-Type:Content-Transfer-Encoding:CC:Date: Subject:From; b=nW97KB39JLhzIedqNpJLFmUTGNw0mrDbP4riYn684Z+TfnYnnmpZn08mQB9CDv+ct +jMWbH2HdYMkoTsmOyXMzobBGKNCZCPT7nRZ251Cf5Vqn7imPhbF6H2S+UTQf3Hioq HpEdHH96QEIIRluvY/PMEd87nDQUswlDVXsPHyHNWpJR+UzGKnoO13ZQhW6TYYjrhP Z+iMCi8Ber8kb/t2ZomvDzIdYFfPPoByBItzy6i+VJ0naogiCOxIHs3xatn+ztRVbj 8lhdCESE9qq22XRPagWOOeEbfe+UVQCES6VZCRAix6U92I4yQ4HLrzh+5UjfZKhJIE aRXvAHlWt6iQw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vates.tech; s=mte1; t=1773419703; x=1773680203; i=thierry.escande@vates.tech; bh=vBvMj1s8yDbIqTjPGPxPkkkz4nmbCVdKzy+th6j4Qis=; h=From:Subject:To:Cc:Message-Id:In-Reply-To:References:Feedback-ID: Date:MIME-Version:Content-Type:Content-Transfer-Encoding:CC:Date: Subject:From; b=mr3OMuMwONIlQMIgUASU69/UPpBr2wwvjoZFyrTQcMwEjthGpYeL3wsN5A6Yy+1Wc yREliV5fA8X1Kbur6XdKOMFbODDEhVKYxVFvSiKAdIcniSQHtfW918CmyZAn/HOcYH kiZiqOyKV7QlL8RqQr7FFfAkMkWBWGdl9uECP2K1D3eNXFCdDGTwtTRRiWADMtlbXs aGpP+Zr7CxDliUOfrdYGLILFtTRCxCzwTHqqTZb18CULxBLQBVDWwGNVBG39Ql/ZiN ibBwGwGnkw4QbIxJaokEFUkQrsIsFixhZWqOyxEmj9XISuf+d2HKRGAYTolKKAWsAr z+GinmlUoqWQA== From: "Thierry Escande" Subject: =?utf-8?Q?[PATCH=2008/17]=20hvmloader:=20Extend=20PCI=20BAR=20struct?= X-Mailer: git-send-email 2.51.0 X-Bm-Disclaimer: Yes X-Bm-Milter-Handled: 4ffbd6c1-ee69-4e1b-aabd-f977039bd3e2 X-Bm-Transport-Timestamp: 1773419702568 To: xen-devel@lists.xenproject.org Cc: "Thierry Escande" , "Jan Beulich" , "Andrew Cooper" , "=?utf-8?Q?Roger=20Pau=20Monn=C3=A9?=" , "Anthony PERARD" , "Alexey Gerasimenko" Message-Id: <20260313163455.790692-9-thierry.escande@vates.tech> In-Reply-To: <20260313163455.790692-1-thierry.escande@vates.tech> References: <20260313163455.790692-1-thierry.escande@vates.tech> X-Native-Encoded: 1 X-Report-Abuse: =?UTF-8?Q?Please=20forward=20a=20copy=20of=20this=20message,=20including=20all=20headers,=20to=20abuse@mandrill.com.=20You=20can=20also=20report=20abuse=20here:=20https://mandrillapp.com/contact/abuse=3Fid=3D30504962.977f1deb1d244fa8b6af82292b76ac72?= X-Mandrill-User: md_30504962 Feedback-ID: 30504962:30504962.20260313:md Date: Fri, 13 Mar 2026 16:35:03 +0000 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @mandrillapp.com) (identity thierry.escande@vates.tech) X-ZM-MESSAGEID: 1773419742242154100 Content-Type: text/plain; charset="utf-8" For the upcoming allocation of the MMCONFIG range in MMIO hole, this patch extends the 'bars' structure to make it universal for any arbitrary BAR type. Either IO, MMIO, ROM or a chipset-specific resource. One important new field is addr_mask, which tells which bits of the base address can (should) be written. Different address types (ROM, MMIO BAR, PCIEXBAR) will have different addr_mask values. For every assignable BAR range we store its size, PCI device BDF (devfn actually) to which it belongs, BAR type (mem/io/mem64) and corresponding register offset in device PCI conf space. Also, to reduce code complexity, all long mem/mem64 BAR flags checks are replaced by simple bars[i] field probing, eg.: - if ( (bar_reg =3D=3D PCI_ROM_ADDRESS) || - ((bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D - PCI_BASE_ADDRESS_SPACE_MEMORY) ) + if ( bars[i].is_mem ) Signed-off-by: Alexey Gerasimenko Signed-off-by: Thierry Escande --- tools/firmware/hvmloader/pci.c | 58 ++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c index 91c7fd2171..6e6720adae 100644 --- a/tools/firmware/hvmloader/pci.c +++ b/tools/firmware/hvmloader/pci.c @@ -160,9 +160,10 @@ static void class_specific_pci_device_setup(uint16_t v= endor_id, =20 void pci_setup(void) { - uint8_t is_64bar, using_64bar, bar64_relocate =3D 0; + uint8_t is_64bar, using_64bar, bar64_relocate =3D 0, is_mem; uint32_t devfn, bar_reg, cmd, bar_data, bar_data_upper; uint64_t base, bar_sz, bar_sz_upper, mmio_total =3D 0; + uint64_t addr_mask; uint8_t vga_devfn =3D 0xff; uint16_t class, vendor_id, device_id; unsigned int bar, pin, link, isa_irq; @@ -176,10 +177,13 @@ void pci_setup(void) =20 /* Create a list of device BARs in descending order of size. */ struct bars { - uint32_t is_64bar; uint32_t devfn; uint32_t bar_reg; uint64_t bar_sz; + uint64_t addr_mask; /* which bits of the base address can be writt= en */ + uint32_t bar_data; /* initial value - BAR flags here */ + uint8_t is_64bar; + uint8_t is_mem; } *bars =3D (struct bars *)scratch_start; unsigned int i, nr_bars =3D 0; uint64_t mmio_hole_size =3D 0; @@ -278,13 +282,21 @@ void pci_setup(void) bar_reg =3D PCI_ROM_ADDRESS; =20 bar_data =3D pci_readl(devfn, bar_reg); + + is_mem =3D !!(((bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D + PCI_BASE_ADDRESS_SPACE_MEMORY) || + (bar_reg =3D=3D PCI_ROM_ADDRESS)); + if ( bar_reg !=3D PCI_ROM_ADDRESS ) { - is_64bar =3D !!((bar_data & (PCI_BASE_ADDRESS_SPACE | - PCI_BASE_ADDRESS_MEM_TYPE_MASK)) =3D=3D - (PCI_BASE_ADDRESS_SPACE_MEMORY | + is_64bar =3D !!(is_mem && + ((bar_data & PCI_BASE_ADDRESS_MEM_TYPE_MASK) = =3D=3D PCI_BASE_ADDRESS_MEM_TYPE_64)); + pci_writel(devfn, bar_reg, ~0); + + addr_mask =3D is_mem ? PCI_BASE_ADDRESS_MEM_MASK + : PCI_BASE_ADDRESS_IO_MASK; } else { @@ -292,15 +304,16 @@ void pci_setup(void) pci_writel(devfn, bar_reg, (bar_data | PCI_ROM_ADDRESS_MASK) & ~PCI_ROM_ADDRESS_ENABLE); + + addr_mask =3D PCI_ROM_ADDRESS_MASK; } + bar_sz =3D pci_readl(devfn, bar_reg); pci_writel(devfn, bar_reg, bar_data); =20 if ( bar_reg !=3D PCI_ROM_ADDRESS ) - bar_sz &=3D (((bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D - PCI_BASE_ADDRESS_SPACE_MEMORY) ? - PCI_BASE_ADDRESS_MEM_MASK : - (PCI_BASE_ADDRESS_IO_MASK & 0xffff)); + bar_sz &=3D is_mem ? PCI_BASE_ADDRESS_MEM_MASK : + (PCI_BASE_ADDRESS_IO_MASK & 0xffff); else bar_sz &=3D PCI_ROM_ADDRESS_MASK; if (is_64bar) { @@ -314,6 +327,9 @@ void pci_setup(void) if ( bar_sz =3D=3D 0 ) continue; =20 + /* leave only memtype/enable bits etc */ + bar_data &=3D ~addr_mask; + if ( !xenpci_bar_uc && ((bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D PCI_BASE_ADDRESS_SPACE_MEMORY) && @@ -359,16 +375,17 @@ void pci_setup(void) if ( i !=3D nr_bars ) memmove(&bars[i+1], &bars[i], (nr_bars-i) * sizeof(*bars)); =20 - bars[i].is_64bar =3D is_64bar; bars[i].devfn =3D devfn; bars[i].bar_reg =3D bar_reg; bars[i].bar_sz =3D bar_sz; + bars[i].is_64bar =3D is_64bar; + bars[i].is_mem =3D is_mem; + bars[i].addr_mask =3D addr_mask; + bars[i].bar_data =3D bar_data; =20 if ( is_64bar && bar_sz > BAR_RELOC_THRESH ) bar64_relocate =3D 1; - else if ( ((bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D - PCI_BASE_ADDRESS_SPACE_MEMORY) || - (bar_reg =3D=3D PCI_ROM_ADDRESS) ) + else if ( is_mem ) mmio_total +=3D bar_sz; =20 nr_bars++; @@ -531,10 +548,10 @@ void pci_setup(void) using_64bar =3D bars[i].is_64bar && bar64_relocate && (mmio_total > (mem_resource.max - mem_resource.base) || bar_sz > BAR_RELOC_THRESH); - bar_data =3D pci_readl(devfn, bar_reg); =20 - if ( (bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D - PCI_BASE_ADDRESS_SPACE_MEMORY ) + bar_data =3D bars[i].bar_data; + + if ( bars[i].is_mem ) { /* Mapping high memory if PCI device is 64 bits bar */ if ( using_64bar ) { @@ -544,11 +561,9 @@ void pci_setup(void) if ( !pci_hi_mem_start ) pci_hi_mem_start =3D high_mem_resource.base; resource =3D &high_mem_resource; - bar_data &=3D ~PCI_BASE_ADDRESS_MEM_MASK; }=20 else { resource =3D &mem_resource; - bar_data &=3D ~PCI_BASE_ADDRESS_MEM_MASK; } if ( bar_sz <=3D BAR_RELOC_THRESH ) mmio_total -=3D bar_sz; @@ -556,7 +571,6 @@ void pci_setup(void) else { resource =3D &io_resource; - bar_data &=3D ~PCI_BASE_ADDRESS_IO_MASK; } =20 base =3D (resource->base + bar_sz - 1) & ~(uint64_t)(bar_sz - 1); @@ -578,7 +592,7 @@ void pci_setup(void) } } =20 - bar_data |=3D (uint32_t)base; + bar_data |=3D (uint32_t) (base & bars[i].addr_mask); bar_data_upper =3D (uint32_t)(base >> 32); base +=3D bar_sz; =20 @@ -600,9 +614,7 @@ void pci_setup(void) PRIllx_arg(bar_sz), bar_data_upper, bar_data); =09 - if ( (bar_reg =3D=3D PCI_ROM_ADDRESS) || - ((bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D - PCI_BASE_ADDRESS_SPACE_MEMORY) ) + if ( bars[i].is_mem ) pci_devfn_decode_type[devfn] |=3D PCI_COMMAND_MEMORY; else pci_devfn_decode_type[devfn] |=3D PCI_COMMAND_IO; --=20 2.51.0 -- Thierry Escande | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech