From nobody Sun Apr 5 13:12:23 2026 Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) (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 79B71372B48; Tue, 17 Feb 2026 18:23:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771352590; cv=none; b=Vr2dNkkGXcfcKi+EP9rQIesiDZjX9UZtSixidpFD/1BrsmBlngaO+lgKdArpwX9Q+B5KaS4ZCO/VYe+929yJsQ8U81WNIMj/Hedsuj7U2bSTccLUFvVpE6beEbu5ra6WvJysuiCUvuuAL1ilkKRW/yIRRvEXRj/HbaZ0Taf+Mzs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771352590; c=relaxed/simple; bh=1nAqrP/iDuFfCt/DsFargvAxTrtpaK4f+CH0eHGCYtY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XUo/TPQMA2xLdMxOjkH6n05f5EPkseZoo5nySeO7/jl078Gt9ZZ0wuF0tSyZQS2pw8zw5GnJfoCzQ7PLzyeJ+9jAR80aOcKyaTodm2iIjgMIwEOwbjry+GQMx+GBcP6XkIlvtsa65Fx6SLYKs5/mjcHMkFbl/pNtYJdCHp23BkU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com; spf=pass smtp.mailfrom=linux.ibm.com; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b=bU6tfL68; arc=none smtp.client-ip=148.163.158.5 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.ibm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ibm.com header.i=@ibm.com header.b="bU6tfL68" Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 61HARjwL3633726; Tue, 17 Feb 2026 18:23:03 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=yESl+cPjSQP58Z1G4 GMJ+9WIdrKLxEfC+dls7mn7rvw=; b=bU6tfL68fS1syWZsYEz6dXNCcs9qB2J6V LbSXQeQ/GbFuSgFZbOp3TfZedqsU3qxNYe9rD9OXOH80IMQXoYzTKubea54clWiD 3ZKzeQzSRSc1nyTZCUx9IakzTfkHeKsWC91Odwht9XV30uo/kCb1ssdT9ZE+5+Z7 krY/8rPBYspJ6pMh9qIQ4dUqjd0ynFgYZXrIuAKqaxorQpUn+sAsIbEKhx82KbMv ZhSSbSGKXzg/Uiy4Q+IKxMOaaWqvFYlBER3PJ9omiZUPSXLaZ7GtoQ3tqvKw4Om7 kiQkz15S/YeJMDMIKPDz1mxFfRMxEULpwIVfIgTI4H1eqEAYPye9w== Received: from ppma23.wdc07v.mail.ibm.com (5d.69.3da9.ip4.static.sl-reverse.com [169.61.105.93]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 4caj644qe1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 17 Feb 2026 18:23:02 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 61HFmVe1017804; Tue, 17 Feb 2026 18:23:02 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4ccb28c3x6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 17 Feb 2026 18:23:02 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay01.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 61HIN0ev57410012 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 17 Feb 2026 18:23:01 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C546E58056; Tue, 17 Feb 2026 18:23:00 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 008B958052; Tue, 17 Feb 2026 18:23:00 +0000 (GMT) Received: from IBM-D32RQW3.ibm.com (unknown [9.61.242.249]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Tue, 17 Feb 2026 18:22:59 +0000 (GMT) From: Farhan Ali To: linux-s390@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org Cc: helgaas@kernel.org, lukas@wunner.de, alex@shazbot.org, clg@redhat.com, stable@vger.kernel.org, alifm@linux.ibm.com, schnelle@linux.ibm.com, mjrosato@linux.ibm.com Subject: [PATCH v9 2/9] s390/pci: Add architecture specific resource/bus address translation Date: Tue, 17 Feb 2026 10:22:50 -0800 Message-ID: <20260217182257.1582-3-alifm@linux.ibm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260217182257.1582-1-alifm@linux.ibm.com> References: <20260217182257.1582-1-alifm@linux.ibm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 7393WSHYSQTT1ru-I0RaXuBGYNsD8cK8 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMjE3MDE0OCBTYWx0ZWRfX7crJStpTIw1j wSMCy1vYUCZpTrquT4v3neN0PdNSrNJetyNZ4ldJ9AEUeBD2lFZolDYp6X8F6RUD9ualHLtWBdj 2uFWwNEOUoz75Q958m3IhLNWx01N+kLrtPZL2ZsUK/jCj3pOmqiNBoJdmYglOSkv36dHrsS8WCF soGQdbkUOXArRkokH3DHg+V2gUt6v9+/7tehyIWEkcIwXN87qMSTOIXnWAiRo+5P2EcUGSugcbl cM4kQ4tFG40++1F/n+rcxpXR0aZ0oilLJH3hx1VZrKi0qBGgLZyLvtA/fSf5prN8iNwf0MSMN/R R1IVYD3cU5ZYkteYOsm0Dg8cSUDSpripCv4j5GmJjIyGQXqqy6098+aQM1wSf9P6oywRMM1u5Ee X18Fjswzzu+0gtz+xWch/Dhv5qfrcmOZV+C1iHF5voxmQZ5lPDo4Xu7LzhF4If4297DH4A1DIx4 Vn4MWVGpSF8ZPF1BbXA== X-Proofpoint-GUID: 7393WSHYSQTT1ru-I0RaXuBGYNsD8cK8 X-Authority-Analysis: v=2.4 cv=U+mfzOru c=1 sm=1 tr=0 ts=6994b206 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=HzLeVaNsDn8A:10 a=VkNPw1HP01LnGYTKEx00:22 a=Mpw57Om8IfrbqaoTuvik:22 a=GgsMoib0sEa3-_RKJdDe:22 a=VnNF1IyMAAAA:8 a=WI2LcE4NPZyv2LzpnzYA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-02-17_03,2026-02-16_04,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 bulkscore=0 impostorscore=0 malwarescore=0 spamscore=0 adultscore=0 phishscore=0 lowpriorityscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2601150000 definitions=main-2602170148 Content-Type: text/plain; charset="utf-8" On s390 today we overwrite the PCI BAR resource address to either an artificial cookie address or MIO address. However this address is different from the bus address of the BARs programmed by firmware. The artificial cookie address was created to index into an array of function handles (zpci_iomap_start). The MIO (mapped I/O) addresses are provided by firmware but maybe different from the bus addresses. This creates an issue when trying to convert the BAR resource address to bus address using the generic pcibios_resource_to_bus(). Implement an architecture specific pcibios_resource_to_bus() function to correctly translate PCI BAR resource addresses to bus addresses for s390. Similarly add architecture specific pcibios_bus_to_resource function to do the reverse translation. Reviewed-by: Niklas Schnelle Signed-off-by: Farhan Ali --- arch/s390/pci/pci.c | 74 +++++++++++++++++++++++++++++++++++++++ drivers/pci/host-bridge.c | 8 ++--- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c index 97bab20bc163..b2e6b53ea8e6 100644 --- a/arch/s390/pci/pci.c +++ b/arch/s390/pci/pci.c @@ -272,6 +272,80 @@ resource_size_t pcibios_align_resource(void *data, con= st struct resource *res, return 0; } =20 +void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *r= egion, + struct resource *res) +{ + struct zpci_bus *zbus =3D bus->sysdata; + struct zpci_bar_struct *zbar; + struct zpci_dev *zdev; + + region->start =3D res->start; + region->end =3D res->end; + + for (int i =3D 0; i < ZPCI_FUNCTIONS_PER_BUS; i++) { + int j =3D 0; + + zbar =3D NULL; + zdev =3D zbus->function[i]; + if (!zdev) + continue; + + for (j =3D 0; j < PCI_STD_NUM_BARS; j++) { + if (zdev->bars[j].res->start =3D=3D res->start && + zdev->bars[j].res->end =3D=3D res->end && + res->flags & IORESOURCE_MEM) { + zbar =3D &zdev->bars[j]; + break; + } + } + + if (zbar) { + /* only MMIO is supported */ + region->start =3D zbar->val & PCI_BASE_ADDRESS_MEM_MASK; + if (zbar->val & PCI_BASE_ADDRESS_MEM_TYPE_64) + region->start |=3D (u64)zdev->bars[j + 1].val << 32; + + region->end =3D region->start + (1UL << zbar->size) - 1; + return; + } + } +} + +void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res, + struct pci_bus_region *region) +{ + struct zpci_bus *zbus =3D bus->sysdata; + struct zpci_dev *zdev; + resource_size_t start, end; + + res->start =3D region->start; + res->end =3D region->end; + + for (int i =3D 0; i < ZPCI_FUNCTIONS_PER_BUS; i++) { + zdev =3D zbus->function[i]; + if (!zdev || !zdev->has_resources) + continue; + + for (int j =3D 0; j < PCI_STD_NUM_BARS; j++) { + if (!zdev->bars[j].size) + continue; + + /* only MMIO is supported */ + start =3D zdev->bars[j].val & PCI_BASE_ADDRESS_MEM_MASK; + if (zdev->bars[j].val & PCI_BASE_ADDRESS_MEM_TYPE_64) + start |=3D (u64)zdev->bars[j + 1].val << 32; + + end =3D start + (1UL << zdev->bars[j].size) - 1; + + if (start =3D=3D region->start && end =3D=3D region->end) { + res->start =3D zdev->bars[j].res->start; + res->end =3D zdev->bars[j].res->end; + return; + } + } + } +} + void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size, pgprot_t prot) { diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c index be5ef6516cff..aed031b8a9f3 100644 --- a/drivers/pci/host-bridge.c +++ b/drivers/pci/host-bridge.c @@ -49,8 +49,8 @@ void pci_set_host_bridge_release(struct pci_host_bridge *= bridge, } EXPORT_SYMBOL_GPL(pci_set_host_bridge_release); =20 -void pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_region *r= egion, - struct resource *res) +void __weak pcibios_resource_to_bus(struct pci_bus *bus, struct pci_bus_re= gion *region, + struct resource *res) { struct pci_host_bridge *bridge =3D pci_find_host_bridge(bus); struct resource_entry *window; @@ -74,8 +74,8 @@ static bool region_contains(struct pci_bus_region *region= 1, return region1->start <=3D region2->start && region1->end >=3D region2->e= nd; } =20 -void pcibios_bus_to_resource(struct pci_bus *bus, struct resource *res, - struct pci_bus_region *region) +void __weak pcibios_bus_to_resource(struct pci_bus *bus, struct resource *= res, + struct pci_bus_region *region) { struct pci_host_bridge *bridge =3D pci_find_host_bridge(bus); struct resource_entry *window; --=20 2.43.0