From patchwork Wed Sep 2 17:58:37 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296817 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=MR4Az9U3; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org; envelope-from=linux-pci+bounces-65164-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sea.lore.kernel.org (sea.lore.kernel.org [IPv6:2600:3c0a:e001:db::12fc:5321]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZnMn1CxVz1xwg for ; Thu, 03 Sep 2026 01:53:57 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id A10F3A5E59 for ; Wed, 2 Sep 2026 15:34:42 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0E4BA4A92C4; Wed, 2 Sep 2026 15:34:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="MR4Az9U3" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C12B93D9DCC for ; Wed, 2 Sep 2026 15:34:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363251; cv=none; b=Q1pA7mopNtkk/ROyf7ij+sLO5EI7/8y1oMZa/sqfLN+T1NOKhG2cUjeOO8sx5apPkF6U3ds2P3wJQqShOmzBr6R/+pxHvPHUy1fuJjV3MHF+N6wLNXMzJtGxnVoJ8MZyVXScktF1cpLMjr52NQ/wpcQj0pB9NlMfV6pMQEJYM1E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363251; c=relaxed/simple; bh=dr6vfVIIr15nkPY00xMblwWSrdPHorLrvBOMwa/YixI=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a87hzPrkLXiUzHHeQ3Dt75FwYEdwIMIC8Yn/hC5Je9ArBu7AaJMPTxgldO6cJLTO8+MjVjDjyTp21lmOIdCL+NFC38WenRsUuQPGv/9SJVJppDiVh19Dl4hOBPL6x20hU4DcE6iN2OuLkHcVu+dnLydtDudEbv11mTvMlF1hq3Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=MR4Az9U3; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363250; x=1819899250; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=dr6vfVIIr15nkPY00xMblwWSrdPHorLrvBOMwa/YixI=; b=MR4Az9U3MRhml0xA2EHxAiaw2W7rh/z60E+EggOOG/LuVVGVaKF5NEHo wsF68nCjVKThx55MV8xQR0BQunN47EEEDdKECPJ9/+E4tnM7G0RPVS+ic 8Pujm91mfFpSfgTAYhcYixFNM5wwO0CaE06xjweJ7He6LmMD0AF85kQqO mzIcDVd2z1vONGJ/RdGa0iUwYZDENHJfTd4Q/yKby2qedAdE7+Fsvmz67 /uR4lMsybMsDHnLHg0y/coGXIsDCLLT5tWbOMIL/J65Zrpj0FUygOQybA PDAOHlCyBs37kyh6VlywfXugkqanneAj7nOkCCiLy4AY/YsQxlXJ5edkY w==; X-CSE-ConnectionGUID: n5uq4MCpSVS37OdzEHP0dA== X-CSE-MsgGUID: hRkiXyCKQpKGg3i/3hZusw== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646659" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646659" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:09 -0700 X-CSE-ConnectionGUID: eyplmz07SV6w7SusytCh1g== X-CSE-MsgGUID: oqtinJOMQTuWYMLpsrBSTg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406742" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:08 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 1/8] PCI: vmd: Add vmd_bus_enumeration() helper function Date: Wed, 2 Sep 2026 17:58:37 +0000 Message-ID: <20260902175846.3497854-2-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Move the vmd bus enumeration code to a new helper vmd_bus_enumeration(). No functional changes. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 89 ++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 40 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index f3b0e45232ef..c7d705fe2530 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -902,6 +902,54 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata) return 0; } +static void vmd_bus_enumeration(struct pci_bus *bus, unsigned long features) +{ + struct pci_bus *child; + struct pci_dev *dev; + int ret; + + vmd_acpi_begin(); + + pci_scan_child_bus(bus); + vmd_domain_reset(vmd_from_bus(bus)); + + /* + * When Intel VMD is enabled, the OS does not discover the Root Ports + * owned by Intel VMD within the MMCFG space. pci_reset_bus() applies + * a reset to the parent of the PCI device supplied as argument. This + * is why we pass a child device, so the reset can be triggered at + * the Intel bridge level and propagated to all the children in the + * hierarchy. + */ + list_for_each_entry(child, &bus->children, node) { + if (!list_empty(&child->devices)) { + dev = list_first_entry(&child->devices, struct pci_dev, + bus_list); + ret = pci_reset_bus(dev); + if (ret) + pci_warn(dev, "can't reset device: %d\n", ret); + + break; + } + } + + pci_assign_unassigned_bus_resources(bus); + + pci_walk_bus(bus, vmd_pm_enable_quirk, &features); + + /* + * VMD root buses are virtual and don't return true on pci_is_pcie() + * and will fail pcie_bus_configure_settings() early. It can instead be + * run on each of the real root ports. + */ + list_for_each_entry(child, &bus->children, node) + pcie_bus_configure_settings(child); + + pci_bus_add_devices(bus); + + vmd_acpi_end(); +} + static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) { struct pci_sysdata *sd = &vmd->sysdata; @@ -912,8 +960,6 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) resource_size_t offset[2] = {0}; resource_size_t membar2_offset = 0x2000; resource_size_t busn_end; - struct pci_bus *child; - struct pci_dev *dev; int ret; ret = vmd_prepare_offsets_and_bus(vmd, features, &membar2_offset, @@ -1038,45 +1084,8 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) WARN(sysfs_create_link(&vmd->dev->dev.kobj, &vmd->bus->dev.kobj, "domain"), "Can't create symlink to domain\n"); - vmd_acpi_begin(); - - pci_scan_child_bus(vmd->bus); - vmd_domain_reset(vmd); + vmd_bus_enumeration(vmd->bus, features); - /* When Intel VMD is enabled, the OS does not discover the Root Ports - * owned by Intel VMD within the MMCFG space. pci_reset_bus() applies - * a reset to the parent of the PCI device supplied as argument. This - * is why we pass a child device, so the reset can be triggered at - * the Intel bridge level and propagated to all the children in the - * hierarchy. - */ - list_for_each_entry(child, &vmd->bus->children, node) { - if (!list_empty(&child->devices)) { - dev = list_first_entry(&child->devices, - struct pci_dev, bus_list); - ret = pci_reset_bus(dev); - if (ret) - pci_warn(dev, "can't reset device: %d\n", ret); - - break; - } - } - - pci_assign_unassigned_bus_resources(vmd->bus); - - pci_walk_bus(vmd->bus, vmd_pm_enable_quirk, &features); - - /* - * VMD root buses are virtual and don't return true on pci_is_pcie() - * and will fail pcie_bus_configure_settings() early. It can instead be - * run on each of the real root ports. - */ - list_for_each_entry(child, &vmd->bus->children, node) - pcie_bus_configure_settings(child); - - pci_bus_add_devices(vmd->bus); - - vmd_acpi_end(); return 0; } From patchwork Wed Sep 2 17:58:38 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296807 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=Te5rOvGO; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=172.234.253.10; helo=sea.lore.kernel.org; envelope-from=linux-pci+bounces-65165-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZn6b21ZZz1xwZ for ; Thu, 03 Sep 2026 01:42:31 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id 5AC8CA6054 for ; Wed, 2 Sep 2026 15:34:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 731904A8A38; Wed, 2 Sep 2026 15:34:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Te5rOvGO" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 594EF3264F7 for ; Wed, 2 Sep 2026 15:34:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363254; cv=none; b=nh6xnwYsajHbDyt2zBFqp8xOOCeWplQ9BKvXMzCCaKj3jMQpb/vsIJmuXKAChqh0URCy98zXeyUx4Viwl7b4W3J67kwXCaHTV/CAg3Omnpf2j7PbGo2ba88ugkMiAGXLrDKgVSvYs1j2cKtYavUHOi6moXEQK8mXRQgIOfmuMhg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363254; c=relaxed/simple; bh=qgJb7sEef0nizcIBEc+OTblU4SOxIF+XL4QKiKj8vKk=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GgmOoWiJsoiBD1IOuch51AMk/CTl39aBs+1UUcd4k++dCvc3uW8OAt/gpOYoAm68khASWu9gPLG1LiusEwudj/B9wQgS9cejoB2G+1sXzPfe1gtZ26+cjM0d5/mECCljf1aMrtjpXaJBG2t5AoRW6yL9o++7wUevDy6EXxsFYP8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=Te5rOvGO; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363252; x=1819899252; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=qgJb7sEef0nizcIBEc+OTblU4SOxIF+XL4QKiKj8vKk=; b=Te5rOvGOcRLfnBzwVMUVlWJrZtM23CId8Hw5HtVSlb7b2Pz9UhgMtVxt lEHuOPe6KMOvoVAD00D96/xI5B0BFBnoUT/EGjeC3ZbOrKND+UOczvMgj gjQcj/8J5BGZYNwstFlGDH7TCuOfwEXo08itjg+cLnCqDaudYAg0HFyKf g7AKz38G+f5R1x+zkhxac9049HN+Ds5cIuf33ZYkB2RWgkdEhmemJ5Sd9 Jyb8NcYsCPypUyO/F1VDI418Be4hDor+9NrmMPObvEANB6eqQhI7RACFt 4Iuncb0BEOh0FhMBpyHq51dC/5pOBaTHbVlEh8X/QjjFv+0rnFhEweCkL A==; X-CSE-ConnectionGUID: yL+Zzix+T/2rbFsg6vGypQ== X-CSE-MsgGUID: qyvt8949SLeXlil1mUy2mw== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646663" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646663" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:12 -0700 X-CSE-ConnectionGUID: lMQm3S5sS2eUPOKubDAhfw== X-CSE-MsgGUID: JYGNhQv8RrazXICaz653Rg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406758" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:11 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 2/8] PCI: vmd: Add vmd_configure_cfgbar() helper function Date: Wed, 2 Sep 2026 17:58:38 +0000 Message-ID: <20260902175846.3497854-3-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Move the VMD CFGBAR initialization code to a new helper vmd_configure_cfgbar(). No functional changes. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index c7d705fe2530..08636e2ba010 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -902,6 +902,22 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata) return 0; } +static void vmd_configure_cfgbar(struct vmd_dev *vmd) +{ + struct resource *res = &vmd->dev->resource[VMD_CFGBAR]; + resource_size_t busn_end; + + /* Do not let resource[0] end go out of bound.*/ + busn_end = vmd->busn_start + (resource_size(res) >> 20) - 1; + busn_end = min_t(resource_size_t, busn_end, 0xff); + vmd->resources[0] = (struct resource) { + .name = "VMD CFGBAR", + .start = vmd->busn_start, + .end = busn_end, + .flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED, + }; +} + static void vmd_bus_enumeration(struct pci_bus *bus, unsigned long features) { struct pci_bus *child; @@ -959,7 +975,6 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) LIST_HEAD(resources); resource_size_t offset[2] = {0}; resource_size_t membar2_offset = 0x2000; - resource_size_t busn_end; int ret; ret = vmd_prepare_offsets_and_bus(vmd, features, &membar2_offset, @@ -967,16 +982,7 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) if (ret) return ret; - /* Do not let resource[0] end go out of bound.*/ - res = &vmd->dev->resource[VMD_CFGBAR]; - busn_end = vmd->busn_start + (resource_size(res) >> 20) - 1; - busn_end = min_t(resource_size_t, busn_end, 0xff); - vmd->resources[0] = (struct resource) { - .name = "VMD CFGBAR", - .start = vmd->busn_start, - .end = busn_end, - .flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED, - }; + vmd_configure_cfgbar(vmd); /* * If the window is below 4GB, clear IORESOURCE_MEM_64 so we can From patchwork Wed Sep 2 17:58:39 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296810 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=TV9Fx6my; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=172.234.253.10; helo=sea.lore.kernel.org; envelope-from=linux-pci+bounces-65166-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZnDL03bFz1xwZ for ; Thu, 03 Sep 2026 01:47:30 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id 59269A6101 for ; Wed, 2 Sep 2026 15:34:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 737733D9DCC; Wed, 2 Sep 2026 15:34:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="TV9Fx6my" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF4D73264F7 for ; Wed, 2 Sep 2026 15:34:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363257; cv=none; b=ZCEQjvrk4JMEZlkVrWNVkf63qsxZJE5jA5e3wwmf4kCoMOKb+Bk3DUUoPQYan9brFyldB15yJe83pKauc3xAWQLR/vcq6nuXv3YAUD+kBALG1gUYlwDxy7AtOBX++dN6V9tOKMuXY6jSO911iZkEeN2oGbxUxGvAwUhzDCgP27Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363257; c=relaxed/simple; bh=VgX4Ihn7goLHg+dndc1AJIY9y7Jnnal3gmEmzdo8xTU=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Gm7Hc5mxDaVADU3+GEAOaeG4QtDBLVsE48mjVJF6hdzioDu37qsJ8xQ20X19gbsZrZA3l23OACW71gj2oqpzQeAs9lElX/pJB/0nB4np6ryJAb/VJ3iIP6QqT/nz6pNgDdL4xw6K/2oz/iR1enGoSPTTNbZCpf/j+V8lwy/TZec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=TV9Fx6my; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363255; x=1819899255; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=VgX4Ihn7goLHg+dndc1AJIY9y7Jnnal3gmEmzdo8xTU=; b=TV9Fx6myfFogXCyHgjoYIOddU+1x9BrwM6n+/3PXHZj9skKkl2+MYfsQ smekxFRPYtOZ8OLH2F6sdIUdRRjHMGqNOuHaIWZcaa0M0uO/qm51eljYN i3LOcVN+Mv7Shq19RmvSEPFH7upr3trx59ecfB3rtVTpyyIR90zhPKRT6 4D7HwiNBW/tAtH7pcyDEdVRsKuQeBOtg4oj/NWKvTo1So+FVbT7g9STcr OrxivP5FOHheipGpJ/r/dtH3oqPp2ExGSVhm4LXVPGyH3VpPv+t2Auuz8 retCVTez7/yzhhBqb0Y2BS77N80k/JNOYYhkmfaDk25pimf4fRFz5U3yG A==; X-CSE-ConnectionGUID: 8iYFj8EeTXGT93syTLXKEQ== X-CSE-MsgGUID: zZVZUSw8SQyeMx9uPRBwGA== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646668" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646668" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:14 -0700 X-CSE-ConnectionGUID: pZjeWZZ6SYeBzVNMCPO3Zw== X-CSE-MsgGUID: Sw+Mad/6S9CiAvbhtPa4JQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406773" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:13 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 3/8] PCI: vmd: Add vmd_configure_membar() and vmd_configure_membar1_membar2() Date: Wed, 2 Sep 2026 17:58:39 +0000 Message-ID: <20260902175846.3497854-4-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Move the MEMBAR1 and MEMBAR2 registry initialization code to new helpers vmd_configure_membar() and vmd_configure_membar1_membar2(). The refactor preserves MEMBAR address/offset/flags programming, but resource name construction is now generated in the helper ("VMD MEMBAR%d") instead of using two separate string literals. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 98 +++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 30 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index 08636e2ba010..213aba6fc9bb 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -918,6 +918,69 @@ static void vmd_configure_cfgbar(struct vmd_dev *vmd) }; } +/* + * vmd_configure_membar - Configure VMD MemBAR register, which points + * to MMIO address assigned by the OS or BIOS. + * @vmd: the VMD device + * @resource_number: resource buffer number to be filled in + * @membar_number: number of the MemBAR + * @start_offset: 4K aligned offset applied to start of VMD’s MEMBAR MMIO space + * @end_offset: 4K aligned offset applied to end of VMD’s MEMBAR MMIO space + * + * Function fills resource buffer inside the VMD structure. + * + * Return: 0 on success, -ENOMEM on allocation failure. + */ +static int vmd_configure_membar(struct vmd_dev *vmd, u8 resource_number, + u8 membar_number, resource_size_t start_offset, + resource_size_t end_offset) +{ + char *name; + u32 upper_bits; + unsigned long flags; + + struct resource *res = &vmd->dev->resource[membar_number]; + + upper_bits = upper_32_bits(res->end); + flags = res->flags & ~IORESOURCE_SIZEALIGN; + if (!upper_bits) + flags &= ~IORESOURCE_MEM_64; + + name = devm_kasprintf(&vmd->dev->dev, GFP_KERNEL, "VMD MEMBAR%d", + resource_number); + if (!name) + return -ENOMEM; + + vmd->resources[resource_number] = (struct resource){ + .name = name, + .start = res->start + start_offset, + .end = res->end - end_offset, + .flags = flags, + .parent = res, + }; + + return 0; +} + +static int vmd_configure_membar1_membar2(struct vmd_dev *vmd, + resource_size_t mbar2_ofs) +{ + int ret; + + ret = vmd_configure_membar(vmd, 1, VMD_MEMBAR1, 0, 0); + if (ret) + return ret; + + ret = vmd_configure_membar(vmd, 2, VMD_MEMBAR2, mbar2_ofs, 0); + if (ret) { + devm_kfree(&vmd->dev->dev, (void *)vmd->resources[1].name); + memset(&vmd->resources[1], 0, sizeof(vmd->resources[1])); + return ret; + } + + return 0; +} + static void vmd_bus_enumeration(struct pci_bus *bus, unsigned long features) { struct pci_bus *child; @@ -969,9 +1032,6 @@ static void vmd_bus_enumeration(struct pci_bus *bus, unsigned long features) static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) { struct pci_sysdata *sd = &vmd->sysdata; - struct resource *res; - u32 upper_bits; - unsigned long flags; LIST_HEAD(resources); resource_size_t offset[2] = {0}; resource_size_t membar2_offset = 0x2000; @@ -996,36 +1056,14 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) * * The only way we could use a 64-bit non-prefetchable MEMBAR is * if its address is <4GB so that we can convert it to a 32-bit - * resource. To be visible to the host OS, all VMD endpoints must + * resource. To be visible to the host OS, all VMD endpoints must * be initially configured by platform BIOS, which includes setting - * up these resources. We can assume the device is configured + * up these resources. We can assume the device is configured * according to the platform needs. */ - res = &vmd->dev->resource[VMD_MEMBAR1]; - upper_bits = upper_32_bits(res->end); - flags = res->flags & ~IORESOURCE_SIZEALIGN; - if (!upper_bits) - flags &= ~IORESOURCE_MEM_64; - vmd->resources[1] = (struct resource) { - .name = "VMD MEMBAR1", - .start = res->start, - .end = res->end, - .flags = flags, - .parent = res, - }; - - res = &vmd->dev->resource[VMD_MEMBAR2]; - upper_bits = upper_32_bits(res->end); - flags = res->flags & ~IORESOURCE_SIZEALIGN; - if (!upper_bits) - flags &= ~IORESOURCE_MEM_64; - vmd->resources[2] = (struct resource) { - .name = "VMD MEMBAR2", - .start = res->start + membar2_offset, - .end = res->end, - .flags = flags, - .parent = res, - }; + ret = vmd_configure_membar1_membar2(vmd, membar2_offset); + if (ret) + return ret; /* * Currently MSI remapping must be enabled in guest passthrough mode From patchwork Wed Sep 2 17:58:40 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296808 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=NJkec2vx; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=172.232.135.74; helo=sto.lore.kernel.org; envelope-from=linux-pci+bounces-65167-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sto.lore.kernel.org (sto.lore.kernel.org [172.232.135.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZn6b6Gtcz1y1C for ; Thu, 03 Sep 2026 01:42:31 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sto.lore.kernel.org (Postfix) with ESMTP id D6F416036AC for ; Wed, 2 Sep 2026 15:34:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id ACD463264F7; Wed, 2 Sep 2026 15:34:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="NJkec2vx" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F9474A64D6 for ; Wed, 2 Sep 2026 15:34:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363260; cv=none; b=GfQKNTLnZ+B6nK8BuSo+GnmZ9LTgpg5OcQQF+TM73FTR75TLLhvoKHYSXqsugRLFCyLuSHljF1bEfSa1JfXFtUEv79IJuLK5YsnL20O89XVudHxFz+nx9vpCCBb6CALrC3gHEJgbz+vtelVkPkx7vZzTYjN3OL8YGmVz6pR8n5A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363260; c=relaxed/simple; bh=BLRBZ093OePpW91T62fSNDHRvmGVFTg7cSeCMAgZpJk=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=isVZL3fOxENvMW9Uwmdb+kZjaUXZduLr2Mxi29acWSQGXaeVXvpavq2Iv4lQp+fqjBvaaPs496wh9Iv2UXSoHx2adqfmXDnot55LW8iubC9uhrtakICDCAYB1hx4/IaTQMhkeW5RxJk+Q5OigwBR0/NVU5+BHLnd4g4jCujVbMA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=NJkec2vx; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363258; x=1819899258; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=BLRBZ093OePpW91T62fSNDHRvmGVFTg7cSeCMAgZpJk=; b=NJkec2vxMtSLXSVTGDjgX28r9gPymA18Rm+ipvI1zYxq/0hONkCU0R2l anJjFfyIy2I0W4ZsR74weekRlr+CMUxg5JmFnoTe/azcSz/v420/e7hM6 q0uQHDDcsdJhdtXD5kLIFIZVXMmsE2/0aLtUGcqQPAsnX/1NwhG9ef+oD GrX36JluVr7gtiG5j301i0zs3HV6EnYwoaYzeIPpaCxR1qJDGJMqdGeuf A2XZD6V9po5CrgXuQ0MyiH9/gtT5jDqSjeMzF0BtIi3YDbLuXU1KtS6Kp VSvoT205xFE7OCyGsTXupU2E1VJXsNe5jnORYARZHliWewpOFH6Fxn2Ne A==; X-CSE-ConnectionGUID: N/7KF/7iQ1qEGS+aeCNL0g== X-CSE-MsgGUID: H5lMDGfjSieQjc+FAstbKA== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646675" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646675" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:18 -0700 X-CSE-ConnectionGUID: j8uHCcbWTJC1si6wBlDRrA== X-CSE-MsgGUID: sZ9EOrF0TBWDFkJs/cSkIA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406788" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:17 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 4/8] PCI: vmd: Add vmd_create_bus() Date: Wed, 2 Sep 2026 17:58:40 +0000 Message-ID: <20260902175846.3497854-5-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Move the VMD bus initialization code to a new helper vmd_create_bus(). No functional changes. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 57 ++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index 213aba6fc9bb..e19b7fcb2025 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -981,6 +981,37 @@ static int vmd_configure_membar1_membar2(struct vmd_dev *vmd, return 0; } +static int vmd_create_bus(struct vmd_dev *vmd, struct pci_sysdata *sd, + resource_size_t *offset) +{ + LIST_HEAD(resources); + + pci_add_resource(&resources, &vmd->resources[0]); + pci_add_resource_offset(&resources, &vmd->resources[1], offset[0]); + pci_add_resource_offset(&resources, &vmd->resources[2], offset[1]); + + vmd->bus = pci_create_root_bus(&vmd->dev->dev, vmd->busn_start, + &vmd_ops, sd, &resources); + if (!vmd->bus) { + pci_free_resource_list(&resources); + return -ENODEV; + } + + /* Don't copy _OSC control flags in VM, it disables features.*/ + if (!offset[0] || !offset[1]) + vmd_copy_host_bridge_flags(pci_find_host_bridge(vmd->dev->bus), + to_pci_host_bridge(vmd->bus->bridge)); + + vmd_attach_resources(vmd); + if (vmd->irq_domain) + dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain); + else + dev_set_msi_domain(&vmd->bus->dev, + dev_get_msi_domain(&vmd->dev->dev)); + + return 0; +} + static void vmd_bus_enumeration(struct pci_bus *bus, unsigned long features) { struct pci_bus *child; @@ -1032,7 +1063,6 @@ static void vmd_bus_enumeration(struct pci_bus *bus, unsigned long features) static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) { struct pci_sysdata *sd = &vmd->sysdata; - LIST_HEAD(resources); resource_size_t offset[2] = {0}; resource_size_t membar2_offset = 0x2000; int ret; @@ -1086,10 +1116,6 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) vmd_set_msi_remapping(vmd, false); } - pci_add_resource(&resources, &vmd->resources[0]); - pci_add_resource_offset(&resources, &vmd->resources[1], offset[0]); - pci_add_resource_offset(&resources, &vmd->resources[2], offset[1]); - sd->vmd_dev = vmd->dev; /* @@ -1104,27 +1130,14 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) sd->node = pcibus_to_node(vmd->dev->bus); - vmd->bus = pci_create_root_bus(&vmd->dev->dev, vmd->busn_start, - &vmd_ops, sd, &resources); - if (!vmd->bus) { + ret = vmd_create_bus(vmd, sd, offset); + if (ret) { + pci_err(vmd->dev, "Can't create bus: %d\n", ret); pci_bus_release_emul_domain_nr(sd->domain); - pci_free_resource_list(&resources); vmd_remove_irq_domain(vmd); - return -ENODEV; + return ret; } - /* Don't copy _OSC control flags in VM, it disables features.*/ - if (!offset[0] || !offset[1]) - vmd_copy_host_bridge_flags(pci_find_host_bridge(vmd->dev->bus), - to_pci_host_bridge(vmd->bus->bridge)); - - vmd_attach_resources(vmd); - if (vmd->irq_domain) - dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain); - else - dev_set_msi_domain(&vmd->bus->dev, - dev_get_msi_domain(&vmd->dev->dev)); - WARN(sysfs_create_link(&vmd->dev->dev.kobj, &vmd->bus->dev.kobj, "domain"), "Can't create symlink to domain\n"); From patchwork Wed Sep 2 17:58:41 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296818 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=ggIc1Yb+; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org; envelope-from=linux-pci+bounces-65168-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sea.lore.kernel.org (sea.lore.kernel.org [IPv6:2600:3c0a:e001:db::12fc:5321]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZnV25nL9z1xvf for ; Thu, 03 Sep 2026 01:59:22 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id 1632CA630D for ; Wed, 2 Sep 2026 15:34:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3F4AA4A8A23; Wed, 2 Sep 2026 15:34:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="ggIc1Yb+" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4330D4A92C2 for ; Wed, 2 Sep 2026 15:34:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363268; cv=none; b=ZvOY1fo7qtcNg3cvnKoWEMNrm6B4ZN/zY4jrlLtl2xDVQgYerUip/+Dgx515aRpTUPnRk2K02WeEepvBFml/tX4xlFov7ibF5S5QVlYWhSlQmjP7wQnA5/897/RQdJSQO+s2VsBdIrdRxEp785ZxeIgbRkVHh8b6t3qMWpmMxTg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363268; c=relaxed/simple; bh=hj9HuOaIHtrvi/VQuqRrnBMYJj0qVtxj1es0oPunoIw=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HRQ5YqcsT60Spz40hGjuKG1itUR50SSMmcTFRPc164QcGW81WGisoOjoRMqF4jlXuoLU/wvihQgXwBuyqj5vlFzI5suQ/LriqLQJ/OpqNd/osMzOn/KC32pFX+xbafvH7D75Kifx0CgyS4y1J+0xRkJg2MpeGx7pOl+RdRKBj9k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=ggIc1Yb+; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363264; x=1819899264; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=hj9HuOaIHtrvi/VQuqRrnBMYJj0qVtxj1es0oPunoIw=; b=ggIc1Yb+IM0a+RzDLp0taG4TWygZr4YSR4SbCnvo9xp2hTt4NthUiHT9 AZiBk1Nh1CfNhTI79Lf7TOZa3Ef2YyX6Wm1QKcB6c60Vmq4iMNlqkyTCQ eFPaLgZ5PQz/7RcWQ68Aiz/symJkwIU1Kyyiyw0ZbvvS0/V+P61/xiS25 +et76gObSCrS6SwzjxuwT7NxqcpmJbxxRTCgissvWNcbPyySQeSVkV/ZR Jog4/sb5vumjlE+o/C49YGRd1rq0D5++jLgEH8JM7HScBmyAT6OMw39+H PwP/gooM4H3JKFahDQQcikBBQ7XueSysMrIwXmGhGEadeptTFhhG3WH9q w==; X-CSE-ConnectionGUID: OmFytidAQZmnaYmFAS+pIQ== X-CSE-MsgGUID: Ih2DRk2tRYu75hyzJ0lVWg== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646681" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646681" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:23 -0700 X-CSE-ConnectionGUID: BIBjV/KFSRO+BYRTaK44OA== X-CSE-MsgGUID: bbTNJYr4SomuvygpKKG1qQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406824" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:22 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 5/8] PCI: vmd: Replace hardcoded values with enum and defines Date: Wed, 2 Sep 2026 17:58:41 +0000 Message-ID: <20260902175846.3497854-6-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Add enum vmd_resource type to replace hardcoded values. Add defines for vmd bus start number based on VMD restriction value. No functional changes. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 45 ++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index e19b7fcb2025..79ae4a62e29e 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -26,6 +26,11 @@ #define VMD_MEMBAR1 2 #define VMD_MEMBAR2 4 +/* VMD restriction value determines secondary start bus number */ +#define VMD_RESTRICT_0_BUS_START 0x0 +#define VMD_RESTRICT_1_BUS_START 0x80 +#define VMD_RESTRICT_2_BUS_START 0xE0 + #define PCI_REG_VMCAP 0x40 #define BUS_RESTRICT_CAP(vmcap) (vmcap & 0x1) #define PCI_REG_VMCONFIG 0x44 @@ -43,6 +48,13 @@ #define BASE_ID_REG_28C1 0x2840 #define MEMBAR2_OFFSET_28C1 0x30d0 +enum vmd_resource { + VMD_RES_CFGBAR = 0, /* VMD Bus0 Config BAR */ + VMD_RES_MBAR_1, /* VMD Bus0 Resource MemBAR 1 */ + VMD_RES_MBAR_2, /* VMD Bus0 Resource MemBAR 2 */ + VMD_RES_COUNT +}; + enum vmd_features { /* * Device may contain registers which hint the physical location of the @@ -150,7 +162,7 @@ struct vmd_dev { struct vmd_irq_list *irqs; struct pci_sysdata sysdata; - struct resource resources[3]; + struct resource resources[VMD_RES_COUNT]; struct irq_domain *irq_domain; struct pci_bus *bus; u8 busn_start; @@ -562,7 +574,7 @@ static resource_size_t vmd_cfgbar_ecam_space(struct vmd_dev *vmd) } static void vmd_domain_reset(struct vmd_dev *vmd) { - u16 bus, max_buses = resource_size(&vmd->resources[0]); + u16 bus, max_buses = resource_size(&vmd->resources[VMD_RES_CFGBAR]); u8 dev, functions, fn, hdr_type; unsigned int ecam_bus; char __iomem *base; @@ -613,8 +625,8 @@ static void vmd_domain_reset(struct vmd_dev *vmd) static void vmd_attach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1]; - vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2]; + vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[VMD_RES_MBAR_1]; + vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[VMD_RES_MBAR_2]; } static void vmd_detach_resources(struct vmd_dev *vmd) @@ -688,13 +700,13 @@ static int vmd_get_bus_number_start(struct vmd_dev *vmd) switch (BUS_RESTRICT_CFG(reg)) { case 0: - vmd->busn_start = 0; + vmd->busn_start = VMD_RESTRICT_0_BUS_START; break; case 1: - vmd->busn_start = 128; + vmd->busn_start = VMD_RESTRICT_1_BUS_START; break; case 2: - vmd->busn_start = 224; + vmd->busn_start = VMD_RESTRICT_2_BUS_START; break; default: pci_err(dev, "Unknown Bus Offset Setting (%d)\n", @@ -910,7 +922,7 @@ static void vmd_configure_cfgbar(struct vmd_dev *vmd) /* Do not let resource[0] end go out of bound.*/ busn_end = vmd->busn_start + (resource_size(res) >> 20) - 1; busn_end = min_t(resource_size_t, busn_end, 0xff); - vmd->resources[0] = (struct resource) { + vmd->resources[VMD_RES_CFGBAR] = (struct resource) { .name = "VMD CFGBAR", .start = vmd->busn_start, .end = busn_end, @@ -967,14 +979,15 @@ static int vmd_configure_membar1_membar2(struct vmd_dev *vmd, { int ret; - ret = vmd_configure_membar(vmd, 1, VMD_MEMBAR1, 0, 0); + ret = vmd_configure_membar(vmd, VMD_RES_MBAR_1, VMD_MEMBAR1, 0, 0); if (ret) return ret; - ret = vmd_configure_membar(vmd, 2, VMD_MEMBAR2, mbar2_ofs, 0); + ret = vmd_configure_membar(vmd, VMD_RES_MBAR_2, VMD_MEMBAR2, mbar2_ofs, 0); if (ret) { - devm_kfree(&vmd->dev->dev, (void *)vmd->resources[1].name); - memset(&vmd->resources[1], 0, sizeof(vmd->resources[1])); + devm_kfree(&vmd->dev->dev, (void *)vmd->resources[VMD_RES_MBAR_1].name); + memset(&vmd->resources[VMD_RES_MBAR_1], 0, + sizeof(vmd->resources[VMD_RES_MBAR_1])); return ret; } @@ -986,9 +999,11 @@ static int vmd_create_bus(struct vmd_dev *vmd, struct pci_sysdata *sd, { LIST_HEAD(resources); - pci_add_resource(&resources, &vmd->resources[0]); - pci_add_resource_offset(&resources, &vmd->resources[1], offset[0]); - pci_add_resource_offset(&resources, &vmd->resources[2], offset[1]); + pci_add_resource(&resources, &vmd->resources[VMD_RES_CFGBAR]); + pci_add_resource_offset(&resources, &vmd->resources[VMD_RES_MBAR_1], + offset[0]); + pci_add_resource_offset(&resources, &vmd->resources[VMD_RES_MBAR_2], + offset[1]); vmd->bus = pci_create_root_bus(&vmd->dev->dev, vmd->busn_start, &vmd_ops, sd, &resources); From patchwork Wed Sep 2 17:58:42 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296904 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=LpeeFKla; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2600:3c15:e001:75::12fc:5321; helo=sin.lore.kernel.org; envelope-from=linux-pci+bounces-65169-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sin.lore.kernel.org (sin.lore.kernel.org [IPv6:2600:3c15:e001:75::12fc:5321]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZqxh75R1z1xwZ for ; Thu, 03 Sep 2026 03:50:00 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sin.lore.kernel.org (Postfix) with ESMTP id 1055F485A7 for ; Wed, 2 Sep 2026 15:34:55 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 1EAC9377A96; Wed, 2 Sep 2026 15:34:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="LpeeFKla" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05C234A3D5D for ; Wed, 2 Sep 2026 15:34:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363272; cv=none; b=FEOp5TXdm2/wpUe/z27/QDC2ZIRgmWW2EWf2rwim06iGOKTZIkP69TjHAqaa34bsn4oQ9GmbVvwSpalEWSkZx7s3uAFkiiTwJolPUzZ6+fQzYzcworfLt/HjMYSimemyK1cF5HAHMhUWpyc57bqk8EWhIXTav3uPC4Nvee6EoRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363272; c=relaxed/simple; bh=qKqUPatBBx6+rqotUuqQQtEZ2fAjUV28gd2S9Xc5OLM=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NI1OZA3IfWeFQ24ZU3n0iiO+LSW8fobQ8r1RfN7TFuujM6eaA1R7Bhnf90qc09yeMdHaAfByehd6V7YrQJTBDX/bJk2W4jCTYkuzIMJMUjq+z76AIEiQwVgLYzsMiz5ulsGmqJ994m4OWJss1BhfeJrxMi/CZWQAem1HZ8IOQOs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=LpeeFKla; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363269; x=1819899269; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=qKqUPatBBx6+rqotUuqQQtEZ2fAjUV28gd2S9Xc5OLM=; b=LpeeFKla64DG4gFP+FBGFPblSHFmI5zX2264sXgu7h4i9asqW3TXRdJE 3Tj04UDjVqBUUe5cN1zh4cRsoa+x66Z/xmJzKS8IrrbBoY8BHO5weJ7qC qN9rdUudSB6/QgWIzk6AT9DmjMyhlEDrgb15QTjQw111UxEc8MCWT+UsH FUZrGkwAkhL6TAh5yclyRc9ctBlmfVpmLkwy/YAcFaqttMBOqADjeIFDK qFdhY5aMc4uyGjc8AkyYXfrfcvBvkFYc/97pfhwRhCT/WQqsgSey74lCz A6XvI/CKxhq+SASyFkxdsN2cNEwHF0ivV9chKPf61tbEUelK7gzocz4xC A==; X-CSE-ConnectionGUID: p/EpB+VXQcKbcfhRst72Ug== X-CSE-MsgGUID: SspMDmzPQ7aBq+47Sq+yww== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646689" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646689" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:26 -0700 X-CSE-ConnectionGUID: xc8nAK3YQbuDXV2/r72Rgw== X-CSE-MsgGUID: 2Ge/cQhLTh6E6V+qKDHXSw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406851" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:25 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 6/8] PCI: vmd: Convert bus and busn_start to an array Date: Wed, 2 Sep 2026 17:58:42 +0000 Message-ID: <20260902175846.3497854-7-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Convert bus and busn_start from scalar to an array to support multiple VMD buses in the future. No functional changes. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 47 +++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index 79ae4a62e29e..681bdd54f050 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -55,6 +55,11 @@ enum vmd_resource { VMD_RES_COUNT }; +enum vmd_rootbus { + VMD_BUS_0 = 0, + VMD_BUS_COUNT +}; + enum vmd_features { /* * Device may contain registers which hint the physical location of the @@ -164,8 +169,8 @@ struct vmd_dev { struct pci_sysdata sysdata; struct resource resources[VMD_RES_COUNT]; struct irq_domain *irq_domain; - struct pci_bus *bus; - u8 busn_start; + struct pci_bus *bus[VMD_BUS_COUNT]; + u8 busn_start[VMD_BUS_COUNT]; u8 first_vec; char *name; int instance; @@ -425,7 +430,7 @@ static unsigned int vmd_bus_to_ecam(struct vmd_dev *vmd, unsigned int busnr) if (!!(vmd->features & VMD_FEAT_USE_BIOS_INFO)) return busnr; - return busnr - vmd->busn_start; + return busnr - vmd->busn_start[VMD_BUS_0]; } static void __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus, @@ -700,13 +705,13 @@ static int vmd_get_bus_number_start(struct vmd_dev *vmd) switch (BUS_RESTRICT_CFG(reg)) { case 0: - vmd->busn_start = VMD_RESTRICT_0_BUS_START; + vmd->busn_start[VMD_BUS_0] = VMD_RESTRICT_0_BUS_START; break; case 1: - vmd->busn_start = VMD_RESTRICT_1_BUS_START; + vmd->busn_start[VMD_BUS_0] = VMD_RESTRICT_1_BUS_START; break; case 2: - vmd->busn_start = VMD_RESTRICT_2_BUS_START; + vmd->busn_start[VMD_BUS_0] = VMD_RESTRICT_2_BUS_START; break; default: pci_err(dev, "Unknown Bus Offset Setting (%d)\n", @@ -743,7 +748,7 @@ static int vmd_get_bus_info_from_bar4(struct vmd_dev *vmd, bar4_2840 = readq(bar4 + BASE_ID_REG_28C1); base_id = bar4_2840 & 0xFFFFFF; base_bus = base_id >> 8; - vmd->busn_start = base_bus; + vmd->busn_start[VMD_BUS_0] = base_bus; /* Calculate offsets like vmd_get_phys_offsets() does. */ if (phys1) @@ -920,11 +925,11 @@ static void vmd_configure_cfgbar(struct vmd_dev *vmd) resource_size_t busn_end; /* Do not let resource[0] end go out of bound.*/ - busn_end = vmd->busn_start + (resource_size(res) >> 20) - 1; + busn_end = vmd->busn_start[VMD_BUS_0] + (resource_size(res) >> 20) - 1; busn_end = min_t(resource_size_t, busn_end, 0xff); vmd->resources[VMD_RES_CFGBAR] = (struct resource) { .name = "VMD CFGBAR", - .start = vmd->busn_start, + .start = vmd->busn_start[VMD_BUS_0], .end = busn_end, .flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED, }; @@ -1005,9 +1010,10 @@ static int vmd_create_bus(struct vmd_dev *vmd, struct pci_sysdata *sd, pci_add_resource_offset(&resources, &vmd->resources[VMD_RES_MBAR_2], offset[1]); - vmd->bus = pci_create_root_bus(&vmd->dev->dev, vmd->busn_start, - &vmd_ops, sd, &resources); - if (!vmd->bus) { + vmd->bus[VMD_BUS_0] = pci_create_root_bus(&vmd->dev->dev, + vmd->busn_start[VMD_BUS_0], + &vmd_ops, sd, &resources); + if (!vmd->bus[VMD_BUS_0]) { pci_free_resource_list(&resources); return -ENODEV; } @@ -1015,13 +1021,13 @@ static int vmd_create_bus(struct vmd_dev *vmd, struct pci_sysdata *sd, /* Don't copy _OSC control flags in VM, it disables features.*/ if (!offset[0] || !offset[1]) vmd_copy_host_bridge_flags(pci_find_host_bridge(vmd->dev->bus), - to_pci_host_bridge(vmd->bus->bridge)); + to_pci_host_bridge(vmd->bus[VMD_BUS_0]->bridge)); vmd_attach_resources(vmd); if (vmd->irq_domain) - dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain); + dev_set_msi_domain(&vmd->bus[VMD_BUS_0]->dev, vmd->irq_domain); else - dev_set_msi_domain(&vmd->bus->dev, + dev_set_msi_domain(&vmd->bus[VMD_BUS_0]->dev, dev_get_msi_domain(&vmd->dev->dev)); return 0; @@ -1153,10 +1159,11 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) return ret; } - WARN(sysfs_create_link(&vmd->dev->dev.kobj, &vmd->bus->dev.kobj, - "domain"), "Can't create symlink to domain\n"); + WARN(sysfs_create_link(&vmd->dev->dev.kobj, + &vmd->bus[VMD_BUS_0]->dev.kobj, "domain"), + "Can't create symlink to domain\n"); - vmd_bus_enumeration(vmd->bus, features); + vmd_bus_enumeration(vmd->bus[VMD_BUS_0], features); return 0; } @@ -1253,9 +1260,9 @@ static void vmd_remove(struct pci_dev *dev) { struct vmd_dev *vmd = pci_get_drvdata(dev); - pci_stop_root_bus(vmd->bus); + pci_stop_root_bus(vmd->bus[VMD_BUS_0]); sysfs_remove_link(&vmd->dev->dev.kobj, "domain"); - pci_remove_root_bus(vmd->bus); + pci_remove_root_bus(vmd->bus[VMD_BUS_0]); vmd_cleanup_srcu(vmd); vmd_detach_resources(vmd); vmd_remove_irq_domain(vmd); From patchwork Wed Sep 2 17:58:43 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296916 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=GZoEJEl+; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2600:3c15:e001:75::12fc:5321; helo=sin.lore.kernel.org; envelope-from=linux-pci+bounces-65170-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sin.lore.kernel.org (sin.lore.kernel.org [IPv6:2600:3c15:e001:75::12fc:5321]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZr9206wGz1xwg for ; Thu, 03 Sep 2026 03:59:50 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sin.lore.kernel.org (Postfix) with ESMTP id DE60983FC7 for ; Wed, 2 Sep 2026 15:34:58 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 381F037EFE3; Wed, 2 Sep 2026 15:34:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="GZoEJEl+" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0936A4A92DE for ; Wed, 2 Sep 2026 15:34:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363276; cv=none; b=pRZoAwz+k0Y80+JgMQk+7ICwMyH5+jaLfIzykhMlqL/E/iglNPq20Imrcx4fboubaScPao3hGhHKvt/RdpgOqGM51arvCzl853fG5/ihYJDDv2O3VymNvhjPvCcbfMDcmswwZQTA0O9GrqaRKNMtIZAxvYe8HoGuooa57teon+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363276; c=relaxed/simple; bh=eToAmbW8l+AAktas6WVmM5JbBPys0ZV4Tvt/Y5zN1cM=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tIEzYWRekdNzJgHdloxFu7nf8aJdovSC1egUr/Ay20tt8iSzX7a2f9cnAmLjybaTieR6U6OjvWRhQFh10yonUXlK72vGu8u8+VpxtmOv/ucr7ofDand2nVIZSbu2SP+t/YKPP960IHGvKShOO+PXztcPah5vr+WcEKaLKWDX3aM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=GZoEJEl+; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363271; x=1819899271; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=eToAmbW8l+AAktas6WVmM5JbBPys0ZV4Tvt/Y5zN1cM=; b=GZoEJEl+9UnaSNA5zd+cJUFElzgCmDWyowdjJOIL5ahLbEBoOro6te+a Yf9X9QycrPDvsWmI3KtTMnXtiCAzIEvihuj7sz0/2TzlZXQn++p92ys7I yLX6C7VVe/emP9ntdOh2gfXD+C2YLYCfcz8s0JPtBX3qtoM75aoyiqzY8 945hezN8pNBQV5YRQqGRjloB956IYv3JDw1HlCC0k+1ZNuLQPsifqOUwa vQfEdqvWQdfrCr8zYJmVoXEFy7jQlI96E1fOi0aoXNF42+cIwWfSze1QZ YmzH03diy89WK1UocxOURfbfuTDHr3JR0NS1BF0s7MmWznfqpl1uTiiIo Q==; X-CSE-ConnectionGUID: LJaT2KzLS0+5ECqph5riww== X-CSE-MsgGUID: +sOZv3SjReCrS2p1RuQO0w== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646695" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646695" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:30 -0700 X-CSE-ConnectionGUID: i8n/aCenQkmXWf0dY8Z3Bg== X-CSE-MsgGUID: 6ulcyzTLQgOZJeSm5QdoHw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406869" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:28 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 7/8] PCI: vmd: Add support for second rootbus under VMD Date: Wed, 2 Sep 2026 17:58:43 +0000 Message-ID: <20260902175846.3497854-8-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Starting from Intel Arrow Lake VMD enhancement introduces second root bus support with fixed root bus number (0x80). It means that all 3 MMIO BARs exposed by VMD are shared now between both buses (current BUS0 and new BUS1). Add new BUS1 enumeration and divide MMIO space to be shared between both root buses. Due to enumeration issues with root bus hardwired to a fixed non-zero value, this patch will work with a workaround proposed in next patch. Without workaround user won't see attached devices for BUS1 root bus. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 311 +++++++++++++++++++++++++++++++---- 1 file changed, 276 insertions(+), 35 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index 681bdd54f050..7e76ef3d7ec8 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -4,6 +4,7 @@ * Copyright (c) 2015, Intel Corporation. */ +#include #include #include #include @@ -30,6 +31,7 @@ #define VMD_RESTRICT_0_BUS_START 0x0 #define VMD_RESTRICT_1_BUS_START 0x80 #define VMD_RESTRICT_2_BUS_START 0xE0 +#define VMD_RESTRICT_3_BUS_START 0xE1 #define PCI_REG_VMCAP 0x40 #define BUS_RESTRICT_CAP(vmcap) (vmcap & 0x1) @@ -48,15 +50,36 @@ #define BASE_ID_REG_28C1 0x2840 #define MEMBAR2_OFFSET_28C1 0x30d0 +/* Primary Bus Number for VMD devices on root bus 0 */ +#define VMD_PRIMARY_BUS0 0x00 +/* Primary Bus Number for VMD devices on root bus 1 */ +#define VMD_PRIMARY_BUS1 0x80 + +#define VMD_BUSRANGE0 0xc8 +#define VMD_BUSRANGE1 0xcc +#define VMD_MEMBAR1_OFFSET 0xd0 +#define VMD_MEMBAR2_OFFSET1 0xd8 +#define VMD_MEMBAR2_OFFSET2 0xdc +#define VMD_BUS_END(busr) FIELD_GET(GENMASK(15, 8), busr) +#define VMD_BUS_START(busr) FIELD_GET(GENMASK(7, 0), busr) + +/* + * Add VMD resources for BUS1, it will share the same MMIO space with + * previous VMD resources. + */ enum vmd_resource { - VMD_RES_CFGBAR = 0, /* VMD Bus0 Config BAR */ - VMD_RES_MBAR_1, /* VMD Bus0 Resource MemBAR 1 */ - VMD_RES_MBAR_2, /* VMD Bus0 Resource MemBAR 2 */ + VMD_RES_CFGBAR = 0, /* VMD Bus0 Config BAR */ + VMD_RES_MBAR_1, /* VMD Bus0 Resource MemBAR 1 */ + VMD_RES_MBAR_2, /* VMD Bus0 Resource MemBAR 2 */ + VMD_RES_BUS1_CFGBAR, /* VMD Bus1 Config BAR */ + VMD_RES_BUS1_MBAR_1, /* VMD Bus1 Resource MemBAR 1 */ + VMD_RES_BUS1_MBAR_2, /* VMD Bus1 Resource MemBAR 2 */ VMD_RES_COUNT }; enum vmd_rootbus { VMD_BUS_0 = 0, + VMD_BUS_1, VMD_BUS_COUNT }; @@ -109,6 +132,12 @@ enum vmd_features { * to as MEMBAR2 or MSI-X bar. */ VMD_FEAT_USE_BIOS_INFO = (1 << 6), + + /* + * Starting from Intel Arrow Lake, VMD devices have their VMD root ports + * on the additional BUS1 root bus. + */ + VMD_FEAT_HAS_BUS1_ROOTBUS = (1 << 7) }; #define VMD_BIOS_PM_QUIRK_LTR 0x1003 /* 3145728 ns */ @@ -116,7 +145,8 @@ enum vmd_features { #define VMD_FEATS_CLIENT (VMD_FEAT_HAS_MEMBAR_SHADOW_VSCAP | \ VMD_FEAT_HAS_BUS_RESTRICTIONS | \ VMD_FEAT_OFFSET_FIRST_VECTOR | \ - VMD_FEAT_BIOS_PM_QUIRK) + VMD_FEAT_BIOS_PM_QUIRK | \ + VMD_FEAT_HAS_BUS1_ROOTBUS) static DEFINE_IDA(vmd_instance_ida); @@ -175,6 +205,7 @@ struct vmd_dev { char *name; int instance; unsigned long features; + bool bus1_rootbus; }; static inline struct vmd_dev *vmd_from_bus(struct pci_bus *bus) @@ -579,7 +610,8 @@ static resource_size_t vmd_cfgbar_ecam_space(struct vmd_dev *vmd) } static void vmd_domain_reset(struct vmd_dev *vmd) { - u16 bus, max_buses = resource_size(&vmd->resources[VMD_RES_CFGBAR]); + /* One ECAM bus consumes 1MB of CFGBAR space. */ + u16 bus, max_buses = resource_size(&vmd->dev->resource[VMD_CFGBAR]) >> 20; u8 dev, functions, fn, hdr_type; unsigned int ecam_bus; char __iomem *base; @@ -632,12 +664,24 @@ static void vmd_attach_resources(struct vmd_dev *vmd) { vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[VMD_RES_MBAR_1]; vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[VMD_RES_MBAR_2]; + + if (vmd->bus1_rootbus) { + vmd->resources[VMD_RES_MBAR_1].sibling = + &vmd->resources[VMD_RES_BUS1_MBAR_1]; + vmd->resources[VMD_RES_MBAR_2].sibling = + &vmd->resources[VMD_RES_BUS1_MBAR_2]; + } } static void vmd_detach_resources(struct vmd_dev *vmd) { vmd->dev->resource[VMD_MEMBAR1].child = NULL; vmd->dev->resource[VMD_MEMBAR2].child = NULL; + + if (vmd->bus1_rootbus) { + vmd->resources[VMD_RES_MBAR_1].sibling = NULL; + vmd->resources[VMD_RES_MBAR_2].sibling = NULL; + } } static int vmd_get_phys_offsets(struct vmd_dev *vmd, bool native_hint, @@ -694,7 +738,7 @@ static int vmd_get_phys_offsets(struct vmd_dev *vmd, bool native_hint, return 0; } -static int vmd_get_bus_number_start(struct vmd_dev *vmd) +static int vmd_get_bus_number_start(struct vmd_dev *vmd, unsigned long features) { struct pci_dev *dev = vmd->dev; u16 reg; @@ -713,6 +757,24 @@ static int vmd_get_bus_number_start(struct vmd_dev *vmd) case 2: vmd->busn_start[VMD_BUS_0] = VMD_RESTRICT_2_BUS_START; break; + case 3: + if (!(features & VMD_FEAT_HAS_BUS1_ROOTBUS)) { + pci_err(dev, "VMD Bus Restriction detected type %d, but BUS1 root bus is not supported, aborting.\n", + BUS_RESTRICT_CFG(reg)); + return -ENODEV; + } + + /* + * Per Intel VMD specification (e.g., Arrow Lake-S): + * - VMD (on root bus 0) secondary bus start number: 0xE0 + * (devices span 0xE2..0xF0 via VMD_BUSRANGE0). + * - VMD (on root bus 1) secondary bus start number: 0xE1 + * (devices span 0xF1..0xFF via VMD_BUSRANGE1). + */ + vmd->busn_start[VMD_BUS_0] = VMD_RESTRICT_2_BUS_START; + vmd->busn_start[VMD_BUS_1] = VMD_RESTRICT_3_BUS_START; + vmd->bus1_rootbus = true; + break; default: pci_err(dev, "Unknown Bus Offset Setting (%d)\n", BUS_RESTRICT_CFG(reg)); @@ -852,7 +914,7 @@ static int vmd_prepare_offsets_and_bus(struct vmd_dev *vmd, * limits the bus range to between 0-127, 128-255, or 224-255. */ if (features & VMD_FEAT_HAS_BUS_RESTRICTIONS) { - ret = vmd_get_bus_number_start(vmd); + ret = vmd_get_bus_number_start(vmd, features); if (ret) return ret; } @@ -919,7 +981,7 @@ static int vmd_pm_enable_quirk(struct pci_dev *pdev, void *userdata) return 0; } -static void vmd_configure_cfgbar(struct vmd_dev *vmd) +static int vmd_configure_cfgbar(struct vmd_dev *vmd) { struct resource *res = &vmd->dev->resource[VMD_CFGBAR]; resource_size_t busn_end; @@ -933,6 +995,62 @@ static void vmd_configure_cfgbar(struct vmd_dev *vmd) .end = busn_end, .flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED, }; + + if (vmd->bus1_rootbus) { + int ret; + u16 bus0_range = 0; + u16 bus1_range = 0; + u8 bus0_start, bus0_end; + u8 bus1_start, bus1_end; + + ret = pci_read_config_word(vmd->dev, VMD_BUSRANGE0, &bus0_range); + if (ret) { + pci_err(vmd->dev, "Failed to read VMD_BUSRANGE0: %d\n", ret); + return -EIO; + } + + ret = pci_read_config_word(vmd->dev, VMD_BUSRANGE1, &bus1_range); + if (ret) { + pci_err(vmd->dev, "Failed to read VMD_BUSRANGE1: %d\n", ret); + return -EIO; + } + + bus0_start = VMD_BUS_START(bus0_range); + bus0_end = VMD_BUS_END(bus0_range); + bus1_start = VMD_BUS_START(bus1_range); + bus1_end = VMD_BUS_END(bus1_range); + + if (bus0_start > bus0_end || bus1_start > bus1_end) { + pci_err(vmd->dev, + "Invalid bus range(s): BUS0 [%02x-%02x], BUS1 [%02x-%02x]\n", + bus0_start, bus0_end, bus1_start, bus1_end); + return -EINVAL; + } + + if (!(bus0_end < bus1_start || bus1_end < bus0_start)) { + pci_err(vmd->dev, + "Overlapping bus ranges: BUS0 [%02x-%02x], BUS1 [%02x-%02x]\n", + bus0_start, bus0_end, bus1_start, bus1_end); + return -EINVAL; + } + + /* + * Resize BUS0 CFGBAR range to make space for BUS1 + * owned devices by adjusting range end with value stored in + * VMD_BUSRANGE0 register. + */ + vmd->resources[VMD_RES_CFGBAR].start = bus0_start; + vmd->resources[VMD_RES_CFGBAR].end = bus0_end; + + vmd->resources[VMD_RES_BUS1_CFGBAR] = (struct resource){ + .name = "VMD CFGBAR BUS1", + .start = bus1_start, + .end = bus1_end, + .flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED, + }; + } + + return 0; } /* @@ -963,8 +1081,9 @@ static int vmd_configure_membar(struct vmd_dev *vmd, u8 resource_number, if (!upper_bits) flags &= ~IORESOURCE_MEM_64; - name = devm_kasprintf(&vmd->dev->dev, GFP_KERNEL, "VMD MEMBAR%d", - resource_number); + name = devm_kasprintf(&vmd->dev->dev, GFP_KERNEL, "VMD MEMBAR%d %s", + membar_number / 2, + resource_number > VMD_RES_MBAR_2 ? "BUS1" : ""); if (!name) return -ENOMEM; @@ -984,52 +1103,131 @@ static int vmd_configure_membar1_membar2(struct vmd_dev *vmd, { int ret; - ret = vmd_configure_membar(vmd, VMD_RES_MBAR_1, VMD_MEMBAR1, 0, 0); - if (ret) - return ret; + if (vmd->bus1_rootbus) { + u32 reg = 0; + u32 bus1_mbar1_ofs = 0; + u64 bus1_mbar2_ofs = 0; + resource_size_t mbar1_sz, mbar2_sz; - ret = vmd_configure_membar(vmd, VMD_RES_MBAR_2, VMD_MEMBAR2, mbar2_ofs, 0); - if (ret) { - devm_kfree(&vmd->dev->dev, (void *)vmd->resources[VMD_RES_MBAR_1].name); - memset(&vmd->resources[VMD_RES_MBAR_1], 0, - sizeof(vmd->resources[VMD_RES_MBAR_1])); - return ret; + mbar1_sz = resource_size(&vmd->dev->resource[VMD_MEMBAR1]); + mbar2_sz = resource_size(&vmd->dev->resource[VMD_MEMBAR2]); + + ret = pci_read_config_dword(vmd->dev, VMD_MEMBAR1_OFFSET, + &bus1_mbar1_ofs); + if (ret) + return -EIO; + + ret = pci_read_config_dword(vmd->dev, VMD_MEMBAR2_OFFSET1, ®); + if (ret) + return -EIO; + bus1_mbar2_ofs = reg; + + ret = pci_read_config_dword(vmd->dev, VMD_MEMBAR2_OFFSET2, ®); + if (ret) + return -EIO; + bus1_mbar2_ofs |= (u64)reg << 32; + + if (!bus1_mbar1_ofs || bus1_mbar1_ofs >= mbar1_sz) { + pci_err(vmd->dev, "Invalid MEMBAR1 offset %#llx (BAR size %#llx)\n", + (unsigned long long)bus1_mbar1_ofs, + (unsigned long long)mbar1_sz); + return -EINVAL; + } + + if (!bus1_mbar2_ofs || mbar2_ofs >= mbar2_sz || + bus1_mbar2_ofs <= mbar2_ofs || bus1_mbar2_ofs >= mbar2_sz) { + pci_err(vmd->dev, + "Invalid MEMBAR2 split %#llx (shadow offset %#llx, BAR size %#llx)\n", + (unsigned long long)bus1_mbar2_ofs, + (unsigned long long)mbar2_ofs, + (unsigned long long)mbar2_sz); + return -EINVAL; + } + + /* + * Resize BUS MEMBAR1 and MEMBAR2 ranges to make space + * for BUS1 owned devices by adjusting range end with values + * stored in VMD_MEMBAR1_OFFSET and VMD_MEMBAR2_OFFSET registers + */ + ret = vmd_configure_membar(vmd, VMD_RES_MBAR_1, VMD_MEMBAR1, 0, + mbar1_sz - bus1_mbar1_ofs); + if (ret) + return ret; + + ret = vmd_configure_membar(vmd, VMD_RES_MBAR_2, VMD_MEMBAR2, + mbar2_ofs, mbar2_sz - bus1_mbar2_ofs); + if (ret) + return ret; + + ret = vmd_configure_membar(vmd, VMD_RES_BUS1_MBAR_1, VMD_MEMBAR1, + bus1_mbar1_ofs, 0); + if (ret) + return ret; + + ret = vmd_configure_membar(vmd, VMD_RES_BUS1_MBAR_2, VMD_MEMBAR2, + bus1_mbar2_ofs, 0); + if (ret) + return ret; + } else { + ret = vmd_configure_membar(vmd, VMD_RES_MBAR_1, VMD_MEMBAR1, 0, 0); + if (ret) + return ret; + + ret = vmd_configure_membar(vmd, VMD_RES_MBAR_2, VMD_MEMBAR2, + mbar2_ofs, 0); + if (ret) + return ret; } return 0; } -static int vmd_create_bus(struct vmd_dev *vmd, struct pci_sysdata *sd, - resource_size_t *offset) +static int vmd_create_bus(struct vmd_dev *vmd, enum vmd_rootbus bus_number, + struct pci_sysdata *sd, resource_size_t *offset, + u8 primary) { + u8 cfgbar = bus_number * 3; + u8 membar1 = cfgbar + 1; + u8 membar2 = cfgbar + 2; + struct pci_bus *vmd_bus; LIST_HEAD(resources); - pci_add_resource(&resources, &vmd->resources[VMD_RES_CFGBAR]); - pci_add_resource_offset(&resources, &vmd->resources[VMD_RES_MBAR_1], + pci_add_resource(&resources, &vmd->resources[cfgbar]); + pci_add_resource_offset(&resources, &vmd->resources[membar1], offset[0]); - pci_add_resource_offset(&resources, &vmd->resources[VMD_RES_MBAR_2], + pci_add_resource_offset(&resources, &vmd->resources[membar2], offset[1]); - vmd->bus[VMD_BUS_0] = pci_create_root_bus(&vmd->dev->dev, - vmd->busn_start[VMD_BUS_0], - &vmd_ops, sd, &resources); - if (!vmd->bus[VMD_BUS_0]) { + vmd_bus = pci_create_root_bus(&vmd->dev->dev, + vmd->busn_start[bus_number], &vmd_ops, sd, + &resources); + + if (!vmd_bus) { pci_free_resource_list(&resources); return -ENODEV; } + /* + * pci_create_root_bus() does not initialise bus->primary. + * Set it here before any scanning so bridge traversal logic + * sees the correct upstream bus number from the start. + */ + vmd_bus->primary = primary; + /* Don't copy _OSC control flags in VM, it disables features.*/ if (!offset[0] || !offset[1]) vmd_copy_host_bridge_flags(pci_find_host_bridge(vmd->dev->bus), - to_pci_host_bridge(vmd->bus[VMD_BUS_0]->bridge)); + to_pci_host_bridge(vmd_bus->bridge)); vmd_attach_resources(vmd); if (vmd->irq_domain) - dev_set_msi_domain(&vmd->bus[VMD_BUS_0]->dev, vmd->irq_domain); + dev_set_msi_domain(&vmd_bus->dev, vmd->irq_domain); else - dev_set_msi_domain(&vmd->bus[VMD_BUS_0]->dev, + dev_set_msi_domain(&vmd_bus->dev, dev_get_msi_domain(&vmd->dev->dev)); + vmd->bus[bus_number] = vmd_bus; + return 0; } @@ -1042,7 +1240,15 @@ static void vmd_bus_enumeration(struct pci_bus *bus, unsigned long features) vmd_acpi_begin(); pci_scan_child_bus(bus); - vmd_domain_reset(vmd_from_bus(bus)); + + /* + * vmd_domain_reset() walks the full VMD CFGBAR aperture, so a single + * invocation from BUS0 resets bridge windows for the whole VMD domain, + * including BUS1. Running it again during BUS1 enumeration would + * re-clobber windows already assigned for BUS0. + */ + if (bus->primary == VMD_PRIMARY_BUS0) + vmd_domain_reset(vmd_from_bus(bus)); /* * When Intel VMD is enabled, the OS does not discover the Root Ports @@ -1093,7 +1299,9 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) if (ret) return ret; - vmd_configure_cfgbar(vmd); + ret = vmd_configure_cfgbar(vmd); + if (ret) + return ret; /* * If the window is below 4GB, clear IORESOURCE_MEM_64 so we can @@ -1151,7 +1359,7 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) sd->node = pcibus_to_node(vmd->dev->bus); - ret = vmd_create_bus(vmd, sd, offset); + ret = vmd_create_bus(vmd, VMD_BUS_0, sd, offset, VMD_PRIMARY_BUS0); if (ret) { pci_err(vmd->dev, "Can't create bus: %d\n", ret); pci_bus_release_emul_domain_nr(sd->domain); @@ -1163,8 +1371,34 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features) &vmd->bus[VMD_BUS_0]->dev.kobj, "domain"), "Can't create symlink to domain\n"); + if (vmd->bus1_rootbus) { + ret = vmd_create_bus(vmd, VMD_BUS_1, sd, offset, VMD_PRIMARY_BUS1); + if (ret) { + pci_warn(vmd->dev, + "Can't create BUS1: %d, continuing with BUS0 only\n", + ret); + + vmd->resources[VMD_RES_MBAR_1].sibling = NULL; + vmd->resources[VMD_RES_MBAR_2].sibling = NULL; + vmd->resources[VMD_RES_BUS1_CFGBAR] = (struct resource){}; + vmd->resources[VMD_RES_BUS1_MBAR_1] = (struct resource){}; + vmd->resources[VMD_RES_BUS1_MBAR_2] = (struct resource){}; + vmd->bus1_rootbus = false; + vmd->bus[VMD_BUS_1] = NULL; + } + + if (vmd->bus1_rootbus) + WARN(sysfs_create_link(&vmd->dev->dev.kobj, + &vmd->bus[VMD_BUS_1]->dev.kobj, + "domain1"), + "Can't create symlink to domain1\n"); + } + vmd_bus_enumeration(vmd->bus[VMD_BUS_0], features); + if (vmd->bus1_rootbus) + vmd_bus_enumeration(vmd->bus[VMD_BUS_1], features); + return 0; } @@ -1263,6 +1497,13 @@ static void vmd_remove(struct pci_dev *dev) pci_stop_root_bus(vmd->bus[VMD_BUS_0]); sysfs_remove_link(&vmd->dev->dev.kobj, "domain"); pci_remove_root_bus(vmd->bus[VMD_BUS_0]); + + if (vmd->bus1_rootbus && vmd->bus[VMD_BUS_1]) { + pci_stop_root_bus(vmd->bus[VMD_BUS_1]); + sysfs_remove_link(&vmd->dev->dev.kobj, "domain1"); + pci_remove_root_bus(vmd->bus[VMD_BUS_1]); + } + vmd_cleanup_srcu(vmd); vmd_detach_resources(vmd); vmd_remove_irq_domain(vmd); @@ -1359,4 +1600,4 @@ module_pci_driver(vmd_drv); MODULE_AUTHOR("Intel Corporation"); MODULE_DESCRIPTION("Volume Management Device driver"); MODULE_LICENSE("GPL v2"); -MODULE_VERSION("0.6"); +MODULE_VERSION("0.7"); From patchwork Wed Sep 2 17:58:44 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szymon Durawa X-Patchwork-Id: 2296809 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=MFbe8eiw; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org; envelope-from=linux-pci+bounces-65171-incoming=patchwork.ozlabs.org@vger.kernel.org; receiver=patchwork.ozlabs.org) Received: from sea.lore.kernel.org (sea.lore.kernel.org [IPv6:2600:3c0a:e001:db::12fc:5321]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4hZnBD2v9qz1xwZ for ; Thu, 03 Sep 2026 01:45:40 +1000 (AEST) Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id 40F46A68EC for ; Wed, 2 Sep 2026 15:35:02 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D469E4A92C3; Wed, 2 Sep 2026 15:34:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="MFbe8eiw" X-Original-To: linux-pci@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB8944A8FF5 for ; Wed, 2 Sep 2026 15:34:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.198.163.12 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363279; cv=none; b=lsTH4/O38JQkbkTRJz89HiAWy0YzLh92KUru/Wu9C8Ga/kn018xh8eWvJmR+wERyVvb9vGVuLHfYEVM3r7mBFvIgsdh8ADPLeS/LaIVOVsJQSCkk6JihNZQPrPGb9UwlThkhV7Rtz5Rp3P/viNTROLuF8at5qq+zU637SLJJUuU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788363279; c=relaxed/simple; bh=ioFSQLuHXnoqonY/mNTRe2D7gsjT6CZyV92GMFjQ8ys=; h=From:To:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aXmCrk5Yt/pyldFvRYFYUrckniXIH508PbTKvk59VeacF/wcF/6Qp39umOMDwtWZXO2+WmpwDxI7V2BoHqw3AM9zn/x8Gk+zMZI/JmYvo3W/AoEsI5Lry5vwO3huXX2yUlYV8vmnXdWSyX7ZcEz9yyGH5KxX0zZyx0lrNXdOqZQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com; spf=pass smtp.mailfrom=linux.intel.com; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b=MFbe8eiw; arc=none smtp.client-ip=192.198.163.12 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1788363274; x=1819899274; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=ioFSQLuHXnoqonY/mNTRe2D7gsjT6CZyV92GMFjQ8ys=; b=MFbe8eiwPvil/W/I8v8v9D7OdmOm9wUONXaQ+Gp39vDyzcb0mfHQZpCw 4L036NKYq/ddcTEyo8MtCkgR+vNUYHcSsEo6kCr+K3kMBYLMaFUB50Ubh YkuCc3RDsjSwiTh9qP37Q9z2PBsV0nn0iDaSp06Qp+x+dDpuBP8JnSjb7 hiH18RDhVjl/SIsUK5uuN1sB2JnpgjvrEilzny5cbPHLqLY4zUz5pMg6G PJO4crwk/bu9YzWyXyPWFJznX6400MJtxEST00wmVTYE38OIcnXO0bK9W sOtINMqf3ZQBLiu4TwVdkCsXMuCGHwRm0InVJ1PEr1X1njP3ZBEhcdp5m Q==; X-CSE-ConnectionGUID: /78ne3tmQ365trROWfCb3g== X-CSE-MsgGUID: wj9LjQuhSYmF2CG6nZw/Xw== X-IronPort-AV: E=McAfee;i="6800,10657,11894"; a="92646699" X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="92646699" Received: from fmviesa004.fm.intel.com ([10.60.135.144]) by fmvoesa106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:33 -0700 X-CSE-ConnectionGUID: rGXoxqq5RO+TpuZLpB+0Dw== X-CSE-MsgGUID: wYY/nW2dSBmO17yuSXxhAQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,258,1779174000"; d="scan'208";a="271406892" Received: from ubuntu.igk.intel.com ([10.102.114.174]) by fmviesa004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2026 08:34:31 -0700 From: Szymon Durawa To: helgaas@kernel.org, nirmal.patel@linux.intel.com, szymon.durawa@linux.intel.com, djbw@kernel.org, linux-pci@vger.kernel.org, lukas@wunner.de Subject: [PATCH v7 8/8] PCI: vmd: Add workaround for bus number hardwired to fixed non-zero value Date: Wed, 2 Sep 2026 17:58:44 +0000 Message-ID: <20260902175846.3497854-9-szymon.durawa@linux.intel.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> References: <20260902175846.3497854-1-szymon.durawa@linux.intel.com> Precedence: bulk X-Mailing-List: linux-pci@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 The VMD BUS1 root bus number is fixed in hardware to 0x80. It marks bridge invalid configuration when detecting a non-zero (0x80) the VMD BUS1 root bus number. Thus root bus number is deconfigured in the first pass of pci_scan_bridge() to be re-assigned to 0x0 in the second pass. As a result no subordinate bus number behind VMD BUS1 is found. To avoid bus number reconfiguration, BUS1 number has to be the same as BUS1 primary number. Log snippet without workaround: [ 3.752507] vmd 0000:00:0e.0: PCI host bridge to bus 10000:e1 [ 3.752510] pci_bus 10000:e1: busn_res: can not insert [bus e1-ff] under domain [bus 00-ff] (conflicts with (null) [bus e0-f0]) [ 3.752515] pci_bus 10000:e1: root bus resource [bus f1-ff] [ 3.752517] pci_bus 10000:e1: root bus resource [mem 0x8c800000-0x8cffffff] [ 3.752519] pci_bus 10000:e1: root bus resource [mem 0x701b802000-0x701bffffff 64bit] [ 3.752523] pci_bus 10000:e1: scanning bus [ 3.752732] pci (null): Looking for ACPI companion (address 0x80e0ffff) [ 3.752745] pci 10000:e1:1c.0: [8086:7f38] type 01 class 0x060400 PCIe Root Port [ 3.752779] pci 10000:e1:1c.0: PCI bridge to [bus f1] [ 3.752861] pci 10000:e1:1c.0: PME# supported from D0 D3hot D3cold [ 3.752864] pci 10000:e1:1c.0: PME# disabled [ 3.752909] pci 10000:e1:1c.0: PTM enabled (root), 4ns granularity [ 3.752981] pci 10000:e1:1c.0: vgaarb: pci_notify [ 3.752987] pci_bus 10000:e1: fixups for bus [ 3.752992] pci 10000:e1:1c.0: scanning [bus f1-f1] behind bridge, pass 0 [ 3.752993] pci 10000:e1:1c.0: primary 80, bus->number e1. [ 3.752994] pci 10000:e1:1c.0: bridge configuration invalid ([bus f1-f1]), reconfiguring [ 3.753003] pci 10000:e1:1c.0: scanning [bus 00-00] behind bridge, pass 1 [ 3.753004] pci 10000:e1:1c.0: primary 00, bus->number e1. Suggested-by: Nirmal Patel Signed-off-by: Szymon Durawa --- drivers/pci/controller/vmd.c | 66 ++++++++++++++++++++++++++++++++---- 1 file changed, 60 insertions(+), 6 deletions(-) diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c index 7e76ef3d7ec8..f4c6a16e8473 100644 --- a/drivers/pci/controller/vmd.c +++ b/drivers/pci/controller/vmd.c @@ -467,10 +467,23 @@ static unsigned int vmd_bus_to_ecam(struct vmd_dev *vmd, unsigned int busnr) static void __iomem *vmd_cfg_addr(struct vmd_dev *vmd, struct pci_bus *bus, unsigned int devfn, int reg, int len) { + unsigned char bus_number; unsigned int busnr_ecam; u32 offset; - busnr_ecam = vmd_bus_to_ecam(vmd, bus->number); + /* + * Remap ONLY the virtual BUS1 root bus number (0x80) to its physical + * CFGBAR start aperture (0xE1). Downstream subordinate buses behind + * the root port are assigned physical numbers (0xF1..0xFF per + * VMD_BUSRANGE1) and must NOT be remapped, otherwise child endpoint + * accesses would target the root port rather than their own ECAM space. + */ + if (vmd->bus1_rootbus && bus->number == VMD_PRIMARY_BUS1) + bus_number = vmd->busn_start[VMD_BUS_1]; + else + bus_number = bus->number; + + busnr_ecam = vmd_bus_to_ecam(vmd, bus_number); offset = PCIE_ECAM_OFFSET(busnr_ecam, devfn, reg); if (offset + len >= resource_size(&vmd->dev->resource[VMD_CFGBAR])) @@ -550,18 +563,39 @@ static struct pci_ops vmd_ops = { static struct acpi_device *vmd_acpi_find_companion(struct pci_dev *pci_dev) { struct pci_host_bridge *bridge; - u32 busnr, addr; + struct vmd_dev *vmd; + u32 addr; + int busnr; + u8 pci_bus_number; + u8 bridge_bus_number; if (pci_dev->bus->ops != &vmd_ops) return NULL; + vmd = vmd_from_bus(pci_dev->bus); bridge = pci_find_host_bridge(pci_dev->bus); - busnr = pci_dev->bus->number - bridge->bus->number; + pci_bus_number = pci_dev->bus->number; + bridge_bus_number = bridge->bus->number; + + /* + * BUS1 is registered with logical root number 0x80. For ACPI companion + * matching, map only the logical root bus (0x80) to the physical + * BUS1 start base (0xE1). Downstream child buses (0xF1..0xFF) already + * reflect their physical bus numbers and must remain untranslated to + * produce the correct relative depth against bridge_bus_number. + */ + if (vmd->bus1_rootbus && bridge->bus == vmd->bus[VMD_BUS_1]) { + bridge_bus_number = vmd->busn_start[VMD_BUS_1]; + if (pci_bus_number == VMD_PRIMARY_BUS1) + pci_bus_number = vmd->busn_start[VMD_BUS_1]; + } + + busnr = pci_bus_number - bridge_bus_number; /* * The address computation below is only applicable to relative bus * numbers below 32. */ - if (busnr > 31) + if (busnr < 0 || busnr > 31) return NULL; addr = (busnr << 24) | ((u32)pci_dev->devfn << 16) | 0x8000FFFFU; @@ -1186,6 +1220,7 @@ static int vmd_create_bus(struct vmd_dev *vmd, enum vmd_rootbus bus_number, struct pci_sysdata *sd, resource_size_t *offset, u8 primary) { + u8 root_busnr; u8 cfgbar = bus_number * 3; u8 membar1 = cfgbar + 1; u8 membar2 = cfgbar + 2; @@ -1198,8 +1233,27 @@ static int vmd_create_bus(struct vmd_dev *vmd, enum vmd_rootbus bus_number, pci_add_resource_offset(&resources, &vmd->resources[membar2], offset[1]); - vmd_bus = pci_create_root_bus(&vmd->dev->dev, - vmd->busn_start[bus_number], &vmd_ops, sd, + /* + * Register BUS1 with its logical root number (0x80) up front so PCI core + * bridge scanning does not see a post-registration bus-number mutation. + * + * This is a workaround for pci_scan_bridge_extend() code. + * It marks bridge invalid configuration when detecting a + * non-zero (0x80) the VMD BUS1 root bus number. Thus Primary Bus Number + * of Root Ports on BUS1 is deconfigured in the first pass of + * pci_scan_bridge() to be re-assigned to 0x0 in the second pass. + * As a result no subordinate bus number behind VMD BUS1 is found. + * Workaround: VMD_BUS_1 bus number shall be set to VMD_PRIMARY_BUS1 so it has + * the same value as vmd->bus[VMD_BUS_1]->primary, it will bypass bus number + * reconfiguration. + */ + + if (bus_number == VMD_BUS_1 && vmd->bus1_rootbus) + root_busnr = VMD_PRIMARY_BUS1; + else + root_busnr = vmd->busn_start[bus_number]; + + vmd_bus = pci_create_root_bus(&vmd->dev->dev, root_busnr, &vmd_ops, sd, &resources); if (!vmd_bus) {