From nobody Mon Feb 9 13:59:08 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; 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; 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=quarantine dis=none) header.from=suse.com ARC-Seal: i=1; a=rsa-sha256; t=1767707380; cv=none; d=zohomail.com; s=zohoarc; b=d0GNcQvRMhi7f5iSkv+NcZDQ3sQMbOn9/Y9tAk+lzwBgQcvvECEMuA0bqRNxKw7A9Rq4lEkT9EC+MZV+o19k1+CpT/EpP+5mGbAG/TXdtScdXv35jCM3xuOV4KVR2+JHQ9caSFWkzFrwVCIL8b2pICOFwRl6iitbl3EIte7t1y0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1767707380; 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=VALIeZIxI2UW6d8eRGujCTMwXTGh4om+pwgD9mOB0J8=; b=kgiROoFcDMpmqNZDbcNcpz2UWtN8CmJ2dQ018v3pSapJXrJ/VaeQfT0Mg0N7DoeNkwWPq02JaAvxJZdddSEUTrpLdZ2M8MZDl3sxvX3XKRCgfwid9F+xSEnUIwmW+9qN5yYqi0pSNt+zdlJzdMYf+TRNfj6qOm7m1wk/N8XJB/g= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; 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=quarantine dis=none) Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1767707380815877.5608884105435; Tue, 6 Jan 2026 05:49:40 -0800 (PST) Received: from list by lists.xenproject.org with outflank-mailman.1196111.1513984 (Exim 4.92) (envelope-from ) id 1vd7R5-0005vU-Vy; Tue, 06 Jan 2026 13:49:23 +0000 Received: by outflank-mailman (output) from mailman id 1196111.1513984; Tue, 06 Jan 2026 13:49:23 +0000 Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.92) (envelope-from ) id 1vd7R5-0005vN-TC; Tue, 06 Jan 2026 13:49:23 +0000 Received: by outflank-mailman (input) for mailman id 1196111; Tue, 06 Jan 2026 13:49:22 +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 1vd7R4-0004Q3-Fv for xen-devel@lists.xenproject.org; Tue, 06 Jan 2026 13:49:22 +0000 Received: from mail-wr1-x442.google.com (mail-wr1-x442.google.com [2a00:1450:4864:20::442]) by se1-gles-flk1.inumbo.com (Halon) with ESMTPS id 7e9ebcc9-eb06-11f0-9ccf-f158ae23cfc8; Tue, 06 Jan 2026 14:49:17 +0100 (CET) Received: by mail-wr1-x442.google.com with SMTP id ffacd0b85a97d-4308d81fdf6so477272f8f.2 for ; Tue, 06 Jan 2026 05:49:17 -0800 (PST) Received: from [10.156.60.236] (ip-037-024-206-209.um08.pools.vodafone-ip.de. [37.24.206.209]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-432bd0e199bsm4624650f8f.16.2026.01.06.05.49.16 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 06 Jan 2026 05:49:16 -0800 (PST) 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: 7e9ebcc9-eb06-11f0-9ccf-f158ae23cfc8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=google; t=1767707357; x=1768312157; darn=lists.xenproject.org; h=content-transfer-encoding:in-reply-to:autocrypt:content-language :references:cc:to:from:subject:user-agent:mime-version:date :message-id:from:to:cc:subject:date:message-id:reply-to; bh=VALIeZIxI2UW6d8eRGujCTMwXTGh4om+pwgD9mOB0J8=; b=frlJ7Gu0egdILkXe7RuWMHpv3tKqQmRWdcxQC83nbUmMmpZIpa2m8xL5qDerAYmUcV gIjeMn4VrDEzP2qqNK45FkIz2nV5y0fjdMuJ+GT+BM+677C03Q0DElAtgAa4k+tQQwKU 5PxjT7+qnJdqLhJJoeCw8dedQzN8mHzq972scgHulvjtcYUfxXChsLuwGqVU54CXFE8f G8W2rZwTr8jOuy7qNRpAO59v9WC9W0AAqeGyKmIbBjHD4axF7Stx/kqQpBr9pg5aB3fL qXTpdIQHJuuSSYpnzcpz0CYqp1OD1C28Mqh2PiF2qIt5jHpngD/7E4abPi1LjICXnfXj 18jw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767707357; x=1768312157; h=content-transfer-encoding:in-reply-to:autocrypt:content-language :references:cc:to:from:subject:user-agent:mime-version:date :message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=VALIeZIxI2UW6d8eRGujCTMwXTGh4om+pwgD9mOB0J8=; b=v5ux7GZohfbOikVvJPLcxralaOo6SkldnC+OQ1Iv1mbH1lUTVI1NTTjjvMMfrVYAlK CjF5vsnN80y9Cr44yBTew30lhauxq3UZEbls0mWOPPjcPmJiY+dY7P9IhJap11FuYNRr ewGSHozeYeUKT27OWihfIAbAvnZAb596jv25D94OZNC6iAiNW8eIJAIcZGS1E7hrb0c3 s6L2naJO76DMt64DbKrnT5Trb//ApyYQVNXY6rAt0vGqkcQNnpc2VmEfUpEb+ld6exnv wgNN5Jj4HnS5tD/xnYTbZSf5GJm91jvCnPCYKgtNiSYkzU3s/GfymCW+URmLFnXi6Nj0 fgjw== X-Gm-Message-State: AOJu0Yx6ctWXOfD2h5Tv4VFh0xYnFphQ5VXQWymaKQQ3rdZOxMHGL4DD 7TJItIN9exKWcZGMlxtjAEs1H8/vsygkaP2+DEPTt5IEmrs/+11ihQC7yBlX1DzJFQ8Q7CLbN75 HUoso+Q== X-Gm-Gg: AY/fxX4WwE5SZ4DiCV7T8qnG9/WM/sQwP7s2M1s6u+Sg7nKlvWcsOX89/3SkT8wLeVA y19U+Ob4MPnCZRk1uRDoD2bNHzXaBqmBpnIvDGkV8u8Dtz7gu/IptxUr4AwBIU5rZFKyq1hLE0F gEoEtKLEjC6fYQ2ylB0onWBfTMChyyp43P2jYg5OOJ32O6mgCubZrKsDETDit99DxtLyYYmbImk txX2edSlwYS8sBfg62m2pj+K8+hJJtYXNg4HqjKyLUkzy7x8ZxEJAYvK0bFaYwk4uT6NCskxoPD QYM/rFhyD59rfr3nZuIyE93+kZb+HeoT5eFqxfIgeGpPKNvqXn99HhaMogUgLNl10z6aW1lkmwz LM00lF6D6NEQ/PShBGDxAr7j0EqoXJ8oSXpqz/03cgIlPplTHNVtXu95wF+klgbFXZ/Ph1KRDik qylhz9a0IzajZWjSR4Sd4Ja0wetimS9EfpI89MWIIlCOWPuCwMiQGed+65Ecwr7J8iPWRH/k7zD 7pIbC2JhjuSuQ== X-Google-Smtp-Source: AGHT+IGQOlE1EGqvWFA9ndk3JdUEMv0/a8kKS8pTHu3PVfhb0xLjW9bG6MmEKyZoadHrRqGom2yCgA== X-Received: by 2002:a05:6000:40dc:b0:430:f325:435e with SMTP id ffacd0b85a97d-432bca2b787mr3565273f8f.16.1767707357020; Tue, 06 Jan 2026 05:49:17 -0800 (PST) Message-ID: <594cc7a9-710c-4863-b46f-f5e6bc0247de@suse.com> Date: Tue, 6 Jan 2026 14:49:15 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: [PATCH 4/6] PCI: pass pdev to pci_find_{,next_}ext_capability() From: Jan Beulich To: "xen-devel@lists.xenproject.org" Cc: Andrew Cooper , Julien Grall , Stefano Stabellini , Anthony PERARD , Michal Orzel , =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= , Stewart Hildebrand References: <05bc9acd-3054-4c5a-be87-cfd8d7bfa0f8@suse.com> Content-Language: en-US Autocrypt: addr=jbeulich@suse.com; keydata= xsDiBFk3nEQRBADAEaSw6zC/EJkiwGPXbWtPxl2xCdSoeepS07jW8UgcHNurfHvUzogEq5xk hu507c3BarVjyWCJOylMNR98Yd8VqD9UfmX0Hb8/BrA+Hl6/DB/eqGptrf4BSRwcZQM32aZK 7Pj2XbGWIUrZrd70x1eAP9QE3P79Y2oLrsCgbZJfEwCgvz9JjGmQqQkRiTVzlZVCJYcyGGsD /0tbFCzD2h20ahe8rC1gbb3K3qk+LpBtvjBu1RY9drYk0NymiGbJWZgab6t1jM7sk2vuf0Py O9Hf9XBmK0uE9IgMaiCpc32XV9oASz6UJebwkX+zF2jG5I1BfnO9g7KlotcA/v5ClMjgo6Gl MDY4HxoSRu3i1cqqSDtVlt+AOVBJBACrZcnHAUSuCXBPy0jOlBhxPqRWv6ND4c9PH1xjQ3NP nxJuMBS8rnNg22uyfAgmBKNLpLgAGVRMZGaGoJObGf72s6TeIqKJo/LtggAS9qAUiuKVnygo 3wjfkS9A3DRO+SpU7JqWdsveeIQyeyEJ/8PTowmSQLakF+3fote9ybzd880fSmFuIEJldWxp Y2ggPGpiZXVsaWNoQHN1c2UuY29tPsJgBBMRAgAgBQJZN5xEAhsDBgsJCAcDAgQVAggDBBYC AwECHgECF4AACgkQoDSui/t3IH4J+wCfQ5jHdEjCRHj23O/5ttg9r9OIruwAn3103WUITZee e7Sbg12UgcQ5lv7SzsFNBFk3nEQQCACCuTjCjFOUdi5Nm244F+78kLghRcin/awv+IrTcIWF hUpSs1Y91iQQ7KItirz5uwCPlwejSJDQJLIS+QtJHaXDXeV6NI0Uef1hP20+y8qydDiVkv6l IreXjTb7DvksRgJNvCkWtYnlS3mYvQ9NzS9PhyALWbXnH6sIJd2O9lKS1Mrfq+y0IXCP10eS FFGg+Av3IQeFatkJAyju0PPthyTqxSI4lZYuJVPknzgaeuJv/2NccrPvmeDg6Coe7ZIeQ8Yj t0ARxu2xytAkkLCel1Lz1WLmwLstV30g80nkgZf/wr+/BXJW/oIvRlonUkxv+IbBM3dX2OV8 AmRv1ySWPTP7AAMFB/9PQK/VtlNUJvg8GXj9ootzrteGfVZVVT4XBJkfwBcpC/XcPzldjv+3 HYudvpdNK3lLujXeA5fLOH+Z/G9WBc5pFVSMocI71I8bT8lIAzreg0WvkWg5V2WZsUMlnDL9 mpwIGFhlbM3gfDMs7MPMu8YQRFVdUvtSpaAs8OFfGQ0ia3LGZcjA6Ik2+xcqscEJzNH+qh8V m5jjp28yZgaqTaRbg3M/+MTbMpicpZuqF4rnB0AQD12/3BNWDR6bmh+EkYSMcEIpQmBM51qM EKYTQGybRCjpnKHGOxG0rfFY1085mBDZCH5Kx0cl0HVJuQKC+dV2ZY5AqjcKwAxpE75MLFkr wkkEGBECAAkFAlk3nEQCGwwACgkQoDSui/t3IH7nnwCfcJWUDUFKdCsBH/E5d+0ZnMQi+G0A nAuWpQkjM1ASeQwSHEeAWPgskBQL In-Reply-To: <05bc9acd-3054-4c5a-be87-cfd8d7bfa0f8@suse.com> Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @suse.com) X-ZM-MESSAGEID: 1767707381549158500 Content-Type: text/plain; charset="utf-8" This is in preparation of using attributes recorded for devices. Additionally locating (extended) capabilities of non-devices (e.g. phantom functions) makes no sense. While there also eliminate open-coding of PCI_CFG_SPACE_SIZE in adjacent code. Signed-off-by: Jan Beulich Reviewed-by: Teddy Astie --- a/xen/arch/x86/msi.c +++ b/xen/arch/x86/msi.c @@ -676,7 +676,7 @@ static uint64_t read_pci_mem_bar(const s unsigned int pos; uint16_t ctrl, num_vf, offset, stride; =20 - pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_SRIOV); + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); ctrl =3D pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_CTRL); num_vf =3D pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_NUM_VF); offset =3D pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_VF_OFFSET); --- a/xen/drivers/passthrough/ats.c +++ b/xen/drivers/passthrough/ats.c @@ -26,7 +26,7 @@ int enable_ats_device(struct pci_dev *pd u32 value; int pos; =20 - pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS); + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS); BUG_ON(!pos); =20 if ( iommu_verbose ) --- a/xen/drivers/passthrough/ats.h +++ b/xen/drivers/passthrough/ats.h @@ -32,7 +32,7 @@ static inline int pci_ats_enabled(const u32 value; int pos; =20 - pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS); + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS); BUG_ON(!pos); =20 value =3D pci_conf_read16(pdev->sbdf, pos + ATS_REG_CTL); @@ -45,7 +45,7 @@ static inline int pci_ats_device(const s if ( !ats_enabled ) return 0; =20 - return pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS); + return pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS); } =20 #endif /* DRIVERS__PASSTHROUGH__ATS_H */ --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -641,7 +641,7 @@ static void pci_enable_acs(struct pci_de if ( !is_iommu_enabled(pdev->domain) ) return; =20 - pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ACS); + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ACS); if (!pos) return; =20 @@ -787,8 +787,7 @@ int pci_add_device(u16 seg, u8 bus, u8 d =20 if ( !pdev->info.is_virtfn && !pdev->physfn.vf_rlen[0] ) { - unsigned int pos =3D pci_find_ext_capability(pdev->sbdf, - PCI_EXT_CAP_ID_SRIOV); + unsigned int pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_= SRIOV); uint16_t ctrl =3D pci_conf_read16(pdev->sbdf, pos + PCI_SRIOV_CTRL= ); =20 if ( !pos ) --- a/xen/drivers/passthrough/vtd/x86/ats.c +++ b/xen/drivers/passthrough/vtd/x86/ats.c @@ -62,7 +62,7 @@ int ats_device(const struct pci_dev *pde return 0; =20 ats_drhd =3D find_ats_dev_drhd(drhd->iommu); - pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ATS); + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ATS); =20 if ( pos && (ats_drhd =3D=3D NULL) ) { --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -531,10 +531,10 @@ void pci_vtd_quirk(const struct pci_dev /* Sandybridge-EP (Romley) */ case 0x3c00: /* host bridge */ case 0x3c01 ... 0x3c0b: /* root ports */ - pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_ERR); + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR); if ( !pos ) { - pos =3D pci_find_ext_capability(pdev->sbdf, PCI_EXT_CAP_ID_VND= R); + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_VNDR); while ( pos ) { val =3D pci_conf_read32(pdev->sbdf, pos + PCI_VNDR_HEADER); @@ -543,7 +543,7 @@ void pci_vtd_quirk(const struct pci_dev pos +=3D PCI_VNDR_HEADER; break; } - pos =3D pci_find_next_ext_capability(pdev->sbdf, pos, + pos =3D pci_find_next_ext_capability(pdev, pos, PCI_EXT_CAP_ID_VNDR); } ff =3D 0; --- a/xen/drivers/pci/pci.c +++ b/xen/drivers/pci/pci.c @@ -89,9 +89,10 @@ unsigned int pci_find_next_cap(pci_sbdf_ * within the device's PCI configuration space or 0 if the device does * not support it. */ -unsigned int pci_find_ext_capability(pci_sbdf_t sbdf, unsigned int cap) +unsigned int pci_find_ext_capability(const struct pci_dev *pdev, + unsigned int cap) { - return pci_find_next_ext_capability(sbdf, 0, cap); + return pci_find_next_ext_capability(pdev, 0, cap); } =20 /** @@ -104,14 +105,15 @@ unsigned int pci_find_ext_capability(pci * within the device's PCI configuration space or 0 if the device does * not support it. */ -unsigned int pci_find_next_ext_capability(pci_sbdf_t sbdf, unsigned int st= art, +unsigned int pci_find_next_ext_capability(const struct pci_dev *pdev, + unsigned int start, unsigned int cap) { u32 header; int ttl =3D 480; /* 3840 bytes, minimum 8 bytes per capability */ - unsigned int pos =3D max(start, 0x100U); + unsigned int pos =3D max(start, PCI_CFG_SPACE_SIZE + 0U); =20 - header =3D pci_conf_read32(sbdf, pos); + header =3D pci_conf_read32(pdev->sbdf, pos); =20 /* * If we have no capabilities, this is indicated by cap ID, @@ -125,9 +127,9 @@ unsigned int pci_find_next_ext_capabilit if ( PCI_EXT_CAP_ID(header) =3D=3D cap && pos !=3D start ) return pos; pos =3D PCI_EXT_CAP_NEXT(header); - if ( pos < 0x100 ) + if ( pos < PCI_CFG_SPACE_SIZE ) break; - header =3D pci_conf_read32(sbdf, pos); + header =3D pci_conf_read32(pdev->sbdf, pos); } return 0; } --- a/xen/drivers/vpci/rebar.c +++ b/xen/drivers/vpci/rebar.c @@ -53,7 +53,7 @@ static int cf_check init_rebar(struct pc { uint32_t ctrl; unsigned int nbars; - unsigned int rebar_offset =3D pci_find_ext_capability(pdev->sbdf, + unsigned int rebar_offset =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_REB= AR); =20 if ( !rebar_offset ) --- a/xen/drivers/vpci/vpci.c +++ b/xen/drivers/vpci/vpci.c @@ -196,7 +196,7 @@ static struct vpci_register *vpci_get_pr static int vpci_ext_capability_hide( const struct pci_dev *pdev, unsigned int cap) { - const unsigned int offset =3D pci_find_ext_capability(pdev->sbdf, cap); + const unsigned int offset =3D pci_find_ext_capability(pdev, cap); struct vpci_register *r, *prev_r; struct vpci *vpci =3D pdev->vpci; uint32_t header, pre_header; @@ -264,7 +264,7 @@ static int vpci_init_capabilities(struct if ( !is_ext ) pos =3D pci_find_cap_offset(pdev->sbdf, cap); else if ( is_hardware_domain(pdev->domain) ) - pos =3D pci_find_ext_capability(pdev->sbdf, cap); + pos =3D pci_find_ext_capability(pdev, cap); =20 if ( !pos ) continue; @@ -333,7 +333,7 @@ void vpci_deassign_device(struct pci_dev if ( !capability->is_ext ) pos =3D pci_find_cap_offset(pdev->sbdf, cap); else if ( is_hardware_domain(pdev->domain) ) - pos =3D pci_find_ext_capability(pdev->sbdf, cap); + pos =3D pci_find_ext_capability(pdev, cap); if ( pos ) { int rc =3D capability->cleanup(pdev, false); --- a/xen/include/xen/pci.h +++ b/xen/include/xen/pci.h @@ -263,8 +263,10 @@ unsigned int pci_find_next_cap_ttl(pci_s unsigned int *ttl); unsigned int pci_find_next_cap(pci_sbdf_t sbdf, unsigned int pos, unsigned int cap); -unsigned int pci_find_ext_capability(pci_sbdf_t sbdf, unsigned int cap); -unsigned int pci_find_next_ext_capability(pci_sbdf_t sbdf, unsigned int st= art, +unsigned int pci_find_ext_capability(const struct pci_dev *pdev, + unsigned int cap); +unsigned int pci_find_next_ext_capability(const struct pci_dev *pdev, + unsigned int start, unsigned int cap); const char *parse_pci(const char *s, unsigned int *seg_p, unsigned int *bu= s_p, unsigned int *dev_p, unsigned int *func_p);