From nobody Fri Nov 14 16:55:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1760977301; cv=none; d=zohomail.com; s=zohoarc; b=g1aFBBfaKHryVW8a6FBka4ZweBY5R3j+87ostllnO11w3ZtJUI/pjGehIh6ajwKJ5HF2zLoNk0MvcnsimylJWy/JnBtlBRjpMvwddjdMFkvx3XFDmXJtyuVzreCg2cc0HEm1pT2pGtgjOVu0i1c+OazRu6UWHCK96u3jmGwWB78= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760977301; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ss0HU86AGDsJloQcORS+yu3kaT4G7Y6hLigK7G7YxMM=; b=TBMS7UNO2m92+dR2YAi0QsVe2Ck/mgeDtqz2ad6MFGmaHsWc3mtZqDvMZVGDvIkfIA4gN91hDEpeYIx7sKq6NY7KueKFvWs2oPWjpmUSSHB16jhfqgN/KOVJh0jDS9PehzJEt+n8eHl+lOelc1aj62TgGldAXyE17Sprb1DngyA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760977301880918.0822847137374; Mon, 20 Oct 2025 09:21:41 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAsci-0003iH-EK; Mon, 20 Oct 2025 12:20:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAsce-0003gI-Eq; Mon, 20 Oct 2025 12:20:36 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAscc-0000s9-6S; Mon, 20 Oct 2025 12:20:36 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59KC2fg2006614; Mon, 20 Oct 2025 16:20:31 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326jg17-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:31 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59KFZ9wD011053; Mon, 20 Oct 2025 16:20:30 GMT Received: from smtprelay05.wdc07v.mail.ibm.com ([172.16.1.72]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vqx0x94b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:30 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay05.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59KGKSTr24773372 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Oct 2025 16:20:28 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4D44B58068; Mon, 20 Oct 2025 16:20:28 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id ACC0D5805D; Mon, 20 Oct 2025 16:20:27 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.78.141]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Oct 2025 16:20:27 +0000 (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=ss0HU86AGDsJloQcO RS+yu3kaT4G7Y6hLigK7G7YxMM=; b=RHD+DsdF57u+yS+Gs/JMChaQyXqPOa09V jEIShYqX7rpLubIinf2YESYZDSL2DoOq0SL5ZoTvce6/HemijeNFHDaBqB/bnsdk IhH3T7ihFkZqBier+EX9K2jPmnOBkmVChB1za2dCxiHEoPE1MZz5r7iWtxtZ2JoG idTAMp9+WPR/wvHWFCa8WulWVLN72RGDao2knfSmhUQJZDnq9s+3P5QF0+PLQ0wN /BB9vb8oVUHY0r8BTpAuvbmW2kyAOexf5PX34aPkoDsGGrwSynIbil4rkYI65LQi g6pXYhsJl0SsLvZmeEJSvvaNNEn6qxthXWdLogQsMEnKc4g/rS0UQ== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com Cc: jjherne@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, mjrosato@linux.ibm.com, jrossi@linux.ibm.com, zycai@linux.ibm.com Subject: [PATCH 1/7] pc-bios/s390-ccw: Fix Misattributed Function Prototypes Date: Mon, 20 Oct 2025 12:20:17 -0400 Message-ID: <20251020162023.3649165-2-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251020162023.3649165-1-jrossi@linux.ibm.com> References: <20251020162023.3649165-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=EJELElZC c=1 sm=1 tr=0 ts=68f6614f cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=HoESQQHAtyuLEXRXYhEA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX2Lty5Xxo0BBs MpFgm64Ps+AT7QDoe1QUOrQmua1VR5yiLMy265Od7JYGn4UAWNsreh0w+Urv8zY3kSxKrIUs/sJ Dy6N5k4UbsWUMQyRE1LYV2YeOO69qVACwWHVMhUedsoX1LoYFlAbXkE8CdZ3HZ+alNZ3nOBOkjQ BJtiY8/pUcWoqX8yt+9p42VCqlCGGD5rExVBuelqavcFLY3zqNSNE2oZ0r/e83oiNJAqtgcRzkw NjFjIrN91B8cHAzb4bJdGPsEKUvCmsJ5yPqk42/h4Spr5H8BsyFb8AlSTBlIHiKz1rj10vIjxUs VOain0Ls0X3I2/t0C2Eqoic3Q+WQ+RHS9oHPjMvMWyxopSDKPgwPpDP7x/J3F3Qcv+Vyf9G2BEd U8ocSNrksa7LGajfKNzuOLq/89Eh7w== X-Proofpoint-GUID: WRh-62uFnPAhJdyp9VgYl2juV0yYn3s0 X-Proofpoint-ORIG-GUID: WRh-62uFnPAhJdyp9VgYl2juV0yYn3s0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-20_04,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 spamscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=jrossi@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1760977303722158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The virtio-blkdev functions are incorrectly listed in s390-ccw.h as belongi= ng to virtio.c. Additionally, virtio_load_direct() has an unused subchan_id argu= ment. Remove the unused argument and move the prototypes to virtio.h so that they= are independent from the CCW bus. Signed-off-by: Jared Rossi Reviewed-by: Thomas Huth --- pc-bios/s390-ccw/s390-ccw.h | 4 ---- pc-bios/s390-ccw/virtio.h | 7 +++++++ pc-bios/s390-ccw/bootmap.c | 2 +- pc-bios/s390-ccw/virtio-blkdev.c | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index b1dc35cded..47ea66bd4d 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -67,11 +67,7 @@ void sclp_get_loadparm_ascii(char *loadparm); int sclp_read(char *str, size_t count); =20 /* virtio.c */ -unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, - unsigned long subchan_id, void *load_addr= ); bool virtio_is_supported(SubChannelId schid); -int virtio_blk_setup_device(SubChannelId schid); -int virtio_read(unsigned long sector, void *load_addr); =20 /* bootmap.c */ void zipl_load(void); diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 5c5e808a50..597bd42358 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -277,7 +277,14 @@ int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd); int virtio_reset(VDev *vdev); int virtio_setup_ccw(VDev *vdev); =20 +/* virtio-net.c */ int virtio_net_init(void *mac_addr); void virtio_net_deinit(void); =20 +/* virtio-blkdev.c */ +int virtio_blk_setup_device(SubChannelId schid); +int virtio_read(unsigned long sector, void *load_addr); +unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, + void *load_addr); + #endif /* VIRTIO_H */ diff --git a/pc-bios/s390-ccw/bootmap.c b/pc-bios/s390-ccw/bootmap.c index 0f8baa0198..420ee32eff 100644 --- a/pc-bios/s390-ccw/bootmap.c +++ b/pc-bios/s390-ccw/bootmap.c @@ -662,7 +662,7 @@ static int zipl_load_segment(ComponentEntry *entry) */ break; } - address =3D virtio_load_direct(cur_desc[0], cur_desc[1], 0, + address =3D virtio_load_direct(cur_desc[0], cur_desc[1], (void *)address); if (!address) { puts("zIPL load segment failed"); diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 7b2d1e20f4..4b819dd80f 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -64,7 +64,7 @@ int virtio_read_many(unsigned long sector, void *load_add= r, int sec_num) } =20 unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, - unsigned long subchan_id, void *load_addr) + void *load_addr) { u8 status; int sec =3D rec_list1; --=20 2.49.0 From nobody Fri Nov 14 16:55:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1760977352; cv=none; d=zohomail.com; s=zohoarc; b=iW5GheeiaoQs6WWM8ouIL2iLRU+qg+4tCvNOESOmsfmJ/8Lmlhz7npkxyasHgIhs4x2X3GRboz43WcPxVVqU7BdbBgHWXLNMsrXiE2Z84weId2E+m9TnUW1QuNKNc2Xo8AZbHyziGbiNWq/JqON7xohUN42d3kN5tIKJnyogWoo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760977352; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=eaDETEqQkZCPcgw+ElXLQNx2g+HajjVjn39KizoJY4w=; b=EoRISyT1KFzZEcOBwrtF0sO9/hXFBKJhR2Py8CWMq7BWJn+LBZckTJJbE8gqA2XcI1aRXZFYfduR+jbl7TNKoG5dbYCQ5J1g4L7GGRAEkSmlyG6BN20Aw6wcen+Denb5sZ15w8uHsTcAX3Yie/3mNwGb/9xppNqBXcHM1zbv4Mg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760977352881820.5712541071439; Mon, 20 Oct 2025 09:22:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAscj-0003jN-UL; Mon, 20 Oct 2025 12:20:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAsch-0003i2-EE; Mon, 20 Oct 2025 12:20:39 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAscd-0000sJ-9q; Mon, 20 Oct 2025 12:20:39 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59KBxw77018780; Mon, 20 Oct 2025 16:20:33 GMT 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 49v326jg1a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:33 +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 59KEeiMl024303; Mon, 20 Oct 2025 16:20:31 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49vpqjpfqx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:31 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59KGKUKa30605934 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Oct 2025 16:20:30 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2F02C58065; Mon, 20 Oct 2025 16:20:30 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 783E95806B; Mon, 20 Oct 2025 16:20:29 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.78.141]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Oct 2025 16:20:29 +0000 (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=eaDETEqQkZCPcgw+E lXLQNx2g+HajjVjn39KizoJY4w=; b=h/YdWHfI3ebqoE197/XuBJaU4L1voNfbS sUR22601SgQ9YH8+5BASDbTwxSKgWSUUADXppwDZthhd90QAjJ9iby43EO/rpn5Q jdiKn4OKTPjDqUxjuSV8Eqj/2uEoCbWzBig7ToT6cNBGLaXwcDIv12DmgL8w0dYQ eYnckEnUQe8Z8IiPsPe2MvGJtJbsIWrGrdwE9ZmsgbG6vX6Fn4BaGfTTzyiKcGBH dNuf4QVeF4IL2c8U9fbJ12JKOyNt2cYFXlZ54tK5y1eONt2E155YeL4ONyVBW2GP chWNX7YyqdCUz+lAMkzVfjlXZiZjpgZNGF97NGZ4lJjLACuSZZaSg== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com Cc: jjherne@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, mjrosato@linux.ibm.com, jrossi@linux.ibm.com, zycai@linux.ibm.com Subject: [PATCH 2/7] pc-bios/s390-ccw: Split virtio-ccw and generic virtio Date: Mon, 20 Oct 2025 12:20:18 -0400 Message-ID: <20251020162023.3649165-3-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251020162023.3649165-1-jrossi@linux.ibm.com> References: <20251020162023.3649165-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=EJELElZC c=1 sm=1 tr=0 ts=68f66151 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=ctsVLiZ_AAAA:8 a=_Mh3Q-wYLIVKI7ItX_UA:9 a=3VCIHQLkQthbvTRuo98s:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX7P03iFvHEKlT v2CZLhmlu+kYlhWrzz3iw6b3iobqtL5LFih2P8+eiB2LTjoFsAuB1Av9EoeLl/EH2mmmanJEjdX kgARyAAOSb95Vs/dUj8m+2uVifcJiSkKgmIlC+O18omEKigEjqjwsT1UIZdtTnRn2pMmkB7k3F0 DqjmIyDlPD2yZSWAgP9bpLPLi9ofv9D05Lzscd2yTXVfVVB70YgvXqrggd7/6AU7vZHV2eilaNZ 7MVhAbTfshcI14sjNVORh5FkaROOalIi6GZTnTZ0fpV8hJVtCDCSyRGYgPM11ty/u7yeRTWpe0B NYELdUJ0YNF2fBCnAb2HwN+V6qcAFSgEHJSBmLiIfd5Gr6kgfTTnFJP86HyoBWsml4eD4hpA9YH t/GopTYzbHIkTENJqBbIjtZWafd2MQ== X-Proofpoint-GUID: GUM8vIbpWtcbC9uz5ebvhIGomHj15mIF X-Proofpoint-ORIG-GUID: GUM8vIbpWtcbC9uz5ebvhIGomHj15mIF X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-20_04,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 spamscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 clxscore=1011 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=jrossi@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1760977362471158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Separate the CCW specific virtio routines and create generic wrappers for e= asier reuse of existing virtio functions with non-CCW devices. Signed-off-by: Jared Rossi --- hw/s390x/ipl.h | 5 - include/hw/s390x/ipl/qipl.h | 6 + pc-bios/s390-ccw/iplb.h | 4 - pc-bios/s390-ccw/virtio-ccw.h | 25 ++++ pc-bios/s390-ccw/virtio-scsi.h | 2 +- pc-bios/s390-ccw/virtio.h | 11 +- pc-bios/s390-ccw/main.c | 13 +- pc-bios/s390-ccw/virtio-blkdev.c | 57 +++++--- pc-bios/s390-ccw/virtio-ccw.c | 240 +++++++++++++++++++++++++++++++ pc-bios/s390-ccw/virtio-net.c | 5 +- pc-bios/s390-ccw/virtio-scsi.c | 7 +- pc-bios/s390-ccw/virtio.c | 209 +++++---------------------- pc-bios/s390-ccw/Makefile | 3 +- 13 files changed, 367 insertions(+), 220 deletions(-) create mode 100644 pc-bios/s390-ccw/virtio-ccw.h create mode 100644 pc-bios/s390-ccw/virtio-ccw.c diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index 505cded490..aec2244321 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -103,11 +103,6 @@ QEMU_BUILD_BUG_MSG(offsetof(S390IPLState, iplb) & 3, "= alignment of iplb wrong"); #define DIAG308_PV_STORE 9 #define DIAG308_PV_START 10 =20 -#define S390_IPL_TYPE_FCP 0x00 -#define S390_IPL_TYPE_CCW 0x02 -#define S390_IPL_TYPE_PV 0x05 -#define S390_IPL_TYPE_QEMU_SCSI 0xff - #define S390_IPLB_HEADER_LEN 8 #define S390_IPLB_MIN_PV_LEN 148 #define S390_IPLB_MIN_CCW_LEN 200 diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 6824391111..aadab87c2e 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -20,6 +20,12 @@ #define LOADPARM_LEN 8 #define NO_LOADPARM "\0\0\0\0\0\0\0\0" =20 +#define S390_IPL_TYPE_FCP 0x00 +#define S390_IPL_TYPE_CCW 0x02 +#define S390_IPL_TYPE_PCI 0x04 +#define S390_IPL_TYPE_PV 0x05 +#define S390_IPL_TYPE_QEMU_SCSI 0xff + /* * The QEMU IPL Parameters will be stored at absolute address * 204 (0xcc) which means it is 32-bit word aligned but not diff --git a/pc-bios/s390-ccw/iplb.h b/pc-bios/s390-ccw/iplb.h index 08f259ff31..926e8eed5d 100644 --- a/pc-bios/s390-ccw/iplb.h +++ b/pc-bios/s390-ccw/iplb.h @@ -23,10 +23,6 @@ extern QemuIplParameters qipl; extern IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); extern bool have_iplb; =20 -#define S390_IPL_TYPE_FCP 0x00 -#define S390_IPL_TYPE_CCW 0x02 -#define S390_IPL_TYPE_QEMU_SCSI 0xff - static inline bool manage_iplb(IplParameterBlock *iplb, bool store) { register unsigned long addr asm("0") =3D (unsigned long) iplb; diff --git a/pc-bios/s390-ccw/virtio-ccw.h b/pc-bios/s390-ccw/virtio-ccw.h new file mode 100644 index 0000000000..366c4812af --- /dev/null +++ b/pc-bios/s390-ccw/virtio-ccw.h @@ -0,0 +1,25 @@ +/* + * Virtio definitions for CCW devices + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef VIRTIO_CCW_H +#define VIRTIO_CCW_H + +/* main.c */ +extern SubChannelId blk_schid; + +/* virtio-ccw.c */ +int run_ccw(VDev *vdev, int cmd, void *ptr, int len, bool sli); +int drain_irqs_ccw(SubChannelId schid); +bool virtio_ccw_is_supported(SubChannelId schid); +int virtio_ccw_run(VDev *vdev, int vqid, VirtioCmd *cmd); +long virtio_ccw_notify(SubChannelId schid, int vq_idx, long cookie); +int virtio_ccw_setup(VDev *vdev); +int virtio_ccw_reset(VDev *vdev); + +#endif diff --git a/pc-bios/s390-ccw/virtio-scsi.h b/pc-bios/s390-ccw/virtio-scsi.h index c5612e16a2..7a37f8b45a 100644 --- a/pc-bios/s390-ccw/virtio-scsi.h +++ b/pc-bios/s390-ccw/virtio-scsi.h @@ -69,6 +69,6 @@ static inline bool virtio_scsi_response_ok(const VirtioSc= siCmdResp *r) =20 int virtio_scsi_read_many(VDev *vdev, unsigned long sector, void *load_addr, int sec_n= um); -int virtio_scsi_setup_device(SubChannelId schid); +int virtio_scsi_setup_device(void); =20 #endif /* VIRTIO_SCSI_H */ diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 597bd42358..1c1017a0db 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -109,6 +109,8 @@ struct VRing { }; typedef struct VRing VRing; =20 +char *virtio_get_ring_area(void); + =20 /*********************************************** * Virtio block * @@ -138,6 +140,9 @@ typedef struct VRing VRing; /* Barrier before this op. */ #define VIRTIO_BLK_T_BARRIER 0x80000000 =20 +/* For device bus switches */ +extern int ipl_type; + /* This is the first element of the read scatter-gather list. */ struct VirtioBlkOuthdr { /* VIRTIO_BLK_T* */ @@ -236,6 +241,7 @@ struct VDev { int cmd_vr_idx; void *ring_area; long wait_reply_timeout; + VirtioDevType type; VirtioGDN guessed_disk_nature; SubChannelId schid; SenseId senseid; @@ -268,8 +274,9 @@ struct VirtioCmd { }; typedef struct VirtioCmd VirtioCmd; =20 +void vring_init(VRing *vr, VqInfo *info); bool vring_notify(VRing *vr); -int drain_irqs(SubChannelId schid); +int drain_irqs(VRing *vr); void vring_send_buf(VRing *vr, void *p, int len, int flags); int vr_poll(VRing *vr); int vring_wait_reply(void); @@ -282,7 +289,7 @@ int virtio_net_init(void *mac_addr); void virtio_net_deinit(void); =20 /* virtio-blkdev.c */ -int virtio_blk_setup_device(SubChannelId schid); +int virtio_blk_setup_device(void); int virtio_read(unsigned long sector, void *load_addr); unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, void *load_addr); diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 76bf743900..7299b8911f 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -19,11 +19,12 @@ #include "virtio-scsi.h" #include "dasd-ipl.h" =20 -static SubChannelId blk_schid =3D { .one =3D 1 }; +SubChannelId blk_schid =3D { .one =3D 1 }; static char loadparm_str[LOADPARM_LEN + 1]; QemuIplParameters qipl; IplParameterBlock iplb __attribute__((__aligned__(PAGE_SIZE))); bool have_iplb; +int ipl_type; static uint16_t cutype; LowCore *lowcore; /* Yes, this *is* a pointer to address 0 */ =20 @@ -216,7 +217,7 @@ static bool find_boot_device(void) VDev *vdev =3D virtio_get_device(); bool found =3D false; =20 - switch (iplb.pbt) { + switch (ipl_type) { case S390_IPL_TYPE_CCW: vdev->scsi_device_selected =3D false; debug_print_int("device no. ", iplb.ccw.devno); @@ -245,15 +246,15 @@ static int virtio_setup(void) vdev->is_cdrom =3D false; int ret; =20 - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_NET: puts("Network boot device detected"); return 0; case VIRTIO_ID_BLOCK: - ret =3D virtio_blk_setup_device(blk_schid); + ret =3D virtio_blk_setup_device(); break; case VIRTIO_ID_SCSI: - ret =3D virtio_scsi_setup_device(blk_schid); + ret =3D virtio_scsi_setup_device(); break; default: puts("\n! No IPL device available !\n"); @@ -316,11 +317,13 @@ void main(void) css_setup(); have_iplb =3D store_iplb(&iplb); if (!have_iplb) { + ipl_type =3D S390_IPL_TYPE_CCW; /* Assume CCW for probing */ boot_setup(); probe_boot_device(); } =20 while (have_iplb) { + ipl_type =3D iplb.pbt; boot_setup(); if (have_iplb && find_boot_device()) { ipl_boot_device(); diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 4b819dd80f..df6a6d5b70 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -11,6 +11,7 @@ #include #include "s390-ccw.h" #include "virtio.h" +#include "virtio-ccw.h" #include "virtio-scsi.h" =20 #define VIRTIO_BLK_F_GEOMETRY (1 << 4) @@ -40,9 +41,10 @@ static int virtio_blk_read_many(VDev *vdev, unsigned lon= g sector, void *load_add VRING_DESC_F_WRITE | VRING_HIDDEN_IS_CHAIN); =20 /* Now we can tell the host to read */ + vring_notify(vr); vring_wait_reply(); =20 - if (drain_irqs(vr->schid)) { + if (drain_irqs(vr)) { /* Well, whatever status is supposed to contain... */ status =3D 1; } @@ -53,14 +55,14 @@ int virtio_read_many(unsigned long sector, void *load_a= ddr, int sec_num) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_BLOCK: return virtio_blk_read_many(vdev, sector, load_addr, sec_num); case VIRTIO_ID_SCSI: return virtio_scsi_read_many(vdev, sector, load_addr, sec_num); + default: + return -1; } - - return -1; } =20 unsigned long virtio_load_direct(unsigned long rec_list1, unsigned long re= c_list2, @@ -119,7 +121,7 @@ void virtio_assume_iso9660(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_BLOCK: vdev->guessed_disk_nature =3D VIRTIO_GDN_SCSI; vdev->config.blk.blk_size =3D VIRTIO_ISO_BLOCK_SIZE; @@ -129,6 +131,8 @@ void virtio_assume_iso9660(void) case VIRTIO_ID_SCSI: vdev->scsi_block_size =3D VIRTIO_ISO_BLOCK_SIZE; break; + default: + panic("Virtio device type mismatch for iso9660 IPL"); } } =20 @@ -139,13 +143,15 @@ void virtio_assume_eckd(void) vdev->guessed_disk_nature =3D VIRTIO_GDN_DASD; vdev->blk_factor =3D 1; vdev->config.blk.physical_block_exp =3D 0; - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_BLOCK: vdev->config.blk.blk_size =3D VIRTIO_DASD_DEFAULT_BLOCK_SIZE; break; case VIRTIO_ID_SCSI: vdev->config.blk.blk_size =3D vdev->scsi_block_size; break; + default: + panic("Virtio device type mismatch for ECKD IPL"); } vdev->config.blk.geometry.heads =3D 15; vdev->config.blk.geometry.sectors =3D @@ -162,8 +168,7 @@ bool virtio_ipl_disk_is_valid(void) return true; } =20 - return (vdev->senseid.cu_model =3D=3D VIRTIO_ID_BLOCK || - vdev->senseid.cu_model =3D=3D VIRTIO_ID_SCSI) && + return (vdev->type =3D=3D VIRTIO_ID_BLOCK || vdev->type =3D=3D VIRTIO_= ID_SCSI) && blksize >=3D 512 && blksize <=3D 4096; } =20 @@ -171,41 +176,44 @@ int virtio_get_block_size(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.blk_size; case VIRTIO_ID_SCSI: return vdev->scsi_block_size; + default: + return 0; } - return 0; } =20 uint8_t virtio_get_heads(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.geometry.heads; case VIRTIO_ID_SCSI: return vdev->guessed_disk_nature =3D=3D VIRTIO_GDN_DASD ? vdev->config.blk.geometry.heads : 255; + default: + return 0; } - return 0; } =20 uint8_t virtio_get_sectors(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.geometry.sectors; case VIRTIO_ID_SCSI: return vdev->guessed_disk_nature =3D=3D VIRTIO_GDN_DASD ? vdev->config.blk.geometry.sectors : 63; + default: + return 0; } - return 0; } =20 uint64_t virtio_get_blocks(void) @@ -213,24 +221,29 @@ uint64_t virtio_get_blocks(void) VDev *vdev =3D virtio_get_device(); const uint64_t factor =3D virtio_get_block_size() / VIRTIO_SECTOR_SIZE; =20 - switch (vdev->senseid.cu_model) { + switch (vdev->type) { case VIRTIO_ID_BLOCK: return vdev->config.blk.capacity / factor; case VIRTIO_ID_SCSI: return vdev->scsi_last_block / factor; + default: + return 0; } - return 0; } =20 -int virtio_blk_setup_device(SubChannelId schid) +int virtio_blk_setup_device() { VDev *vdev =3D virtio_get_device(); =20 - vdev->guest_features[0] =3D VIRTIO_BLK_F_GEOMETRY | VIRTIO_BLK_F_BLK_S= IZE; - vdev->schid =3D schid; - virtio_setup_ccw(vdev); - puts("Using virtio-blk."); =20 - return 0; + vdev->guest_features[0] =3D VIRTIO_BLK_F_GEOMETRY | VIRTIO_BLK_F_BLK_S= IZE; + switch (ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + vdev->schid =3D blk_schid; + return virtio_ccw_setup(vdev); + } + + return 1; } diff --git a/pc-bios/s390-ccw/virtio-ccw.c b/pc-bios/s390-ccw/virtio-ccw.c new file mode 100644 index 0000000000..1d6e8532f6 --- /dev/null +++ b/pc-bios/s390-ccw/virtio-ccw.c @@ -0,0 +1,240 @@ +/* + * Virtio functionality for CCW devices + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include +#include "s390-ccw.h" +#include "cio.h" +#include "virtio.h" +#include "virtio-ccw.h" +#include "virtio-scsi.h" +#include "bswap.h" +#include "helper.h" +#include "s390-time.h" + +/* virtio spec v1.0 para 4.3.3.2 */ +static long kvm_hypercall(unsigned long nr, unsigned long param1, + unsigned long param2, unsigned long param3) +{ + register unsigned long r_nr asm("1") =3D nr; + register unsigned long r_param1 asm("2") =3D param1; + register unsigned long r_param2 asm("3") =3D param2; + register unsigned long r_param3 asm("4") =3D param3; + register long retval asm("2"); + + asm volatile ("diag %%r2,%%r4,0x500" + : "=3Dd" (retval) + : "d" (r_nr), "0" (r_param1), "r"(r_param2), "d"(r_param= 3) + : "memory", "cc"); + + return retval; +} + +bool virtio_ccw_is_supported(SubChannelId schid) +{ + VDev *vdev =3D virtio_get_device(); + vdev->schid =3D schid; + memset(&vdev->senseid, 0, sizeof(vdev->senseid)); + + /* + * Run sense id command. + * The size of the senseid data differs between devices (notably, + * between virtio devices and dasds), so specify the largest possible + * size and suppress the incorrect length indication for smaller sizes. + */ + if (run_ccw(vdev, CCW_CMD_SENSE_ID, &vdev->senseid, sizeof(vdev->sense= id), + true)) { + return false; + } + + vdev->type =3D vdev->senseid.cu_model; + + if (vdev->senseid.cu_type =3D=3D 0x3832) { + switch (vdev->type) { + case VIRTIO_ID_BLOCK: + case VIRTIO_ID_SCSI: + case VIRTIO_ID_NET: + return true; + default: + return false; + } + } + return false; +} + +int drain_irqs_ccw(SubChannelId schid) +{ + Irb irb =3D {}; + int r =3D 0; + + while (1) { + /* FIXME: make use of TPI, for that enable subchannel and isc */ + if (tsch(schid, &irb)) { + /* Might want to differentiate error codes later on. */ + if (irb.scsw.cstat) { + r =3D -EIO; + } else if (irb.scsw.dstat !=3D 0xc) { + r =3D -EIO; + } + return r; + } + } +} + +long virtio_ccw_notify(SubChannelId schid, int vq_idx, long cookie) +{ + return kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, + vq_idx, cookie); +} + +int virtio_ccw_run(VDev *vdev, int vqid, VirtioCmd *cmd) +{ + VRing *vr =3D &vdev->vrings[vqid]; + int i =3D 0; + + do { + vring_send_buf(vr, cmd[i].data, cmd[i].size, + cmd[i].flags | (i ? VRING_HIDDEN_IS_CHAIN : 0)); + } while (cmd[i++].flags & VRING_DESC_F_NEXT); + + vring_wait_reply(); + if (drain_irqs(vr)) { + return -1; + } + return 0; +} + +int run_ccw(VDev *vdev, int cmd, void *ptr, int len, bool sli) +{ + Ccw1 ccw =3D {}; + + ccw.cmd_code =3D cmd; + ccw.cda =3D (long)ptr; + ccw.count =3D len; + + if (sli) { + ccw.flags |=3D CCW_FLAG_SLI; + } + + return do_cio(vdev->schid, vdev->senseid.cu_type, ptr2u32(&ccw), CCW_F= MT1); +} + +int virtio_ccw_reset(VDev *vdev) +{ + return run_ccw(vdev, CCW_CMD_VDEV_RESET, NULL, 0, false); +} + +int virtio_ccw_setup(VDev *vdev) +{ + int i, cfg_size =3D 0; + uint8_t status; + struct VirtioFeatureDesc { + uint32_t features; + uint8_t index; + } __attribute__((packed)) feats; + + if (!virtio_is_supported(vdev->schid)) { + puts("Virtio unsupported for this device ID"); + return -ENODEV; + } + /* device ID has been established now */ + + vdev->config.blk.blk_size =3D 0; /* mark "illegal" - setup started... = */ + vdev->guessed_disk_nature =3D VIRTIO_GDN_NONE; + + virtio_reset(vdev); + + status =3D VIRTIO_CONFIG_S_ACKNOWLEDGE; + if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { + puts("Could not write ACKNOWLEDGE status to host"); + return -EIO; + } + + switch (vdev->senseid.cu_model) { + case VIRTIO_ID_NET: + vdev->nr_vqs =3D 2; + vdev->cmd_vr_idx =3D 0; + cfg_size =3D sizeof(vdev->config.net); + break; + case VIRTIO_ID_BLOCK: + vdev->nr_vqs =3D 1; + vdev->cmd_vr_idx =3D 0; + cfg_size =3D sizeof(vdev->config.blk); + break; + case VIRTIO_ID_SCSI: + vdev->nr_vqs =3D 3; + vdev->cmd_vr_idx =3D VR_REQUEST; + cfg_size =3D sizeof(vdev->config.scsi); + break; + default: + puts("Unsupported virtio device"); + return -ENODEV; + } + + status |=3D VIRTIO_CONFIG_S_DRIVER; + if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { + puts("Could not write DRIVER status to host"); + return -EIO; + } + + /* Feature negotiation */ + for (i =3D 0; i < ARRAY_SIZE(vdev->guest_features); i++) { + feats.features =3D 0; + feats.index =3D i; + if (run_ccw(vdev, CCW_CMD_READ_FEAT, &feats, sizeof(feats), false)= ) { + puts("Could not get features bits"); + return -EIO; + } + + vdev->guest_features[i] &=3D bswap32(feats.features); + feats.features =3D bswap32(vdev->guest_features[i]); + if (run_ccw(vdev, CCW_CMD_WRITE_FEAT, &feats, sizeof(feats), false= )) { + puts("Could not set features bits"); + return -EIO; + } + } + + if (run_ccw(vdev, CCW_CMD_READ_CONF, &vdev->config, cfg_size, false)) { + puts("Could not get virtio device configuration"); + return -EIO; + } + + for (i =3D 0; i < vdev->nr_vqs; i++) { + VqInfo info =3D { + .queue =3D (unsigned long long) virtio_get_ring_area() + (i * = VIRTIO_RING_SIZE), + .align =3D KVM_S390_VIRTIO_RING_ALIGN, + .index =3D i, + .num =3D 0, + }; + VqConfig config =3D { + .index =3D i, + .num =3D 0, + }; + + if (run_ccw(vdev, CCW_CMD_READ_VQ_CONF, &config, sizeof(config), + false)) { + puts("Could not get virtio device VQ config"); + return -EIO; + } + info.num =3D config.num; + vring_init(&vdev->vrings[i], &info); + vdev->vrings[i].schid =3D vdev->schid; + if (run_ccw(vdev, CCW_CMD_SET_VQ, &info, sizeof(info), false)) { + puts("Cannot set VQ info"); + return -EIO; + } + } + + status |=3D VIRTIO_CONFIG_S_DRIVER_OK; + if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { + puts("Could not write DRIVER_OK status to host"); + return -EIO; + } + + return 0; +} diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c index 301445bf97..604f1cf003 100644 --- a/pc-bios/s390-ccw/virtio-net.c +++ b/pc-bios/s390-ccw/virtio-net.c @@ -19,6 +19,7 @@ #include #include "s390-ccw.h" #include "virtio.h" +#include "virtio-ccw.h" #include "s390-time.h" #include "helper.h" =20 @@ -54,7 +55,7 @@ int virtio_net_init(void *mac_addr) rx_last_idx =3D 0; =20 vdev->guest_features[0] =3D VIRTIO_NET_F_MAC_BIT; - virtio_setup_ccw(vdev); + virtio_ccw_setup(vdev); =20 if (!(vdev->guest_features[0] & VIRTIO_NET_F_MAC_BIT)) { puts("virtio-net device does not support the MAC address feature"); @@ -88,7 +89,7 @@ int send(int fd, const void *buf, int len, int flags) while (!vr_poll(txvq)) { yield(); } - if (drain_irqs(txvq->schid)) { + if (drain_irqs(txvq)) { puts("send: drain irqs failed"); return -1; } diff --git a/pc-bios/s390-ccw/virtio-scsi.c b/pc-bios/s390-ccw/virtio-scsi.c index 71db75ce7b..4a615599fd 100644 --- a/pc-bios/s390-ccw/virtio-scsi.c +++ b/pc-bios/s390-ccw/virtio-scsi.c @@ -13,6 +13,7 @@ #include #include "s390-ccw.h" #include "virtio.h" +#include "virtio-ccw.h" #include "scsi.h" #include "virtio-scsi.h" #include "s390-time.h" @@ -476,12 +477,12 @@ static int virtio_scsi_setup(VDev *vdev) return 0; } =20 -int virtio_scsi_setup_device(SubChannelId schid) +int virtio_scsi_setup_device() { VDev *vdev =3D virtio_get_device(); =20 - vdev->schid =3D schid; - virtio_setup_ccw(vdev); + vdev->schid =3D blk_schid; + virtio_ccw_setup(vdev); =20 if (vdev->config.scsi.sense_size !=3D VIRTIO_SCSI_SENSE_SIZE) { puts("Config: sense size mismatch"); diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index cd6c99c7e3..05cfca4dad 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -13,6 +13,7 @@ #include "cio.h" #include "virtio.h" #include "virtio-scsi.h" +#include "virtio-ccw.h" #include "bswap.h" #include "helper.h" #include "s390-time.h" @@ -41,72 +42,30 @@ VDev *virtio_get_device(void) =20 VirtioDevType virtio_get_device_type(void) { - return vdev.senseid.cu_model; + return vdev.type; } =20 -/* virtio spec v1.0 para 4.3.3.2 */ -static long kvm_hypercall(unsigned long nr, unsigned long param1, - unsigned long param2, unsigned long param3) +char *virtio_get_ring_area(void) { - register unsigned long r_nr asm("1") =3D nr; - register unsigned long r_param1 asm("2") =3D param1; - register unsigned long r_param2 asm("3") =3D param2; - register unsigned long r_param3 asm("4") =3D param3; - register long retval asm("2"); - - asm volatile ("diag %%r2,%%r4,0x500" - : "=3Dd" (retval) - : "d" (r_nr), "0" (r_param1), "r"(r_param2), "d"(r_param= 3) - : "memory", "cc"); - - return retval; -} - -static long virtio_notify(SubChannelId schid, int vq_idx, long cookie) -{ - return kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, - vq_idx, cookie); + return ring_area; } =20 /*********************************************** * Virtio functions * ***********************************************/ =20 -int drain_irqs(SubChannelId schid) -{ - Irb irb =3D {}; - int r =3D 0; - - while (1) { - /* FIXME: make use of TPI, for that enable subchannel and isc */ - if (tsch(schid, &irb)) { - /* Might want to differentiate error codes later on. */ - if (irb.scsw.cstat) { - r =3D -EIO; - } else if (irb.scsw.dstat !=3D 0xc) { - r =3D -EIO; - } - return r; - } - } -} - -static int run_ccw(VDev *vdev, int cmd, void *ptr, int len, bool sli) +int drain_irqs(VRing *vr) { - Ccw1 ccw =3D {}; - - ccw.cmd_code =3D cmd; - ccw.cda =3D (long)ptr; - ccw.count =3D len; - - if (sli) { - ccw.flags |=3D CCW_FLAG_SLI; + switch (ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return drain_irqs_ccw(vr->schid); } =20 - return do_cio(vdev->schid, vdev->senseid.cu_type, ptr2u32(&ccw), CCW_F= MT1); + return 0; } =20 -static void vring_init(VRing *vr, VqInfo *info) +void vring_init(VRing *vr, VqInfo *info) { void *p =3D (void *) info->queue; =20 @@ -134,7 +93,12 @@ static void vring_init(VRing *vr, VqInfo *info) =20 bool vring_notify(VRing *vr) { - vr->cookie =3D virtio_notify(vr->schid, vr->id, vr->cookie); + switch (ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + vr->cookie =3D virtio_ccw_notify(vr->schid, vr->id, vr->cookie); + } + return vr->cookie >=3D 0; } =20 @@ -202,134 +166,24 @@ int vring_wait_reply(void) =20 int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd) { - VRing *vr =3D &vdev->vrings[vqid]; - int i =3D 0; - - do { - vring_send_buf(vr, cmd[i].data, cmd[i].size, - cmd[i].flags | (i ? VRING_HIDDEN_IS_CHAIN : 0)); - } while (cmd[i++].flags & VRING_DESC_F_NEXT); - - vring_wait_reply(); - if (drain_irqs(vr->schid)) { - return -1; + switch (ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_run(vdev, vqid, cmd); } - return 0; -} =20 -int virtio_reset(VDev *vdev) -{ - return run_ccw(vdev, CCW_CMD_VDEV_RESET, NULL, 0, false); + return -1; } =20 -int virtio_setup_ccw(VDev *vdev) +int virtio_reset(VDev *vdev) { - int i, cfg_size =3D 0; - uint8_t status; - struct VirtioFeatureDesc { - uint32_t features; - uint8_t index; - } __attribute__((packed)) feats; - - if (!virtio_is_supported(vdev->schid)) { - puts("Virtio unsupported for this device ID"); - return -ENODEV; + switch (ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_reset(vdev); } - /* device ID has been established now */ - - vdev->config.blk.blk_size =3D 0; /* mark "illegal" - setup started... = */ - vdev->guessed_disk_nature =3D VIRTIO_GDN_NONE; - - virtio_reset(vdev); =20 - status =3D VIRTIO_CONFIG_S_ACKNOWLEDGE; - if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { - puts("Could not write ACKNOWLEDGE status to host"); - return -EIO; - } - - switch (vdev->senseid.cu_model) { - case VIRTIO_ID_NET: - vdev->nr_vqs =3D 2; - vdev->cmd_vr_idx =3D 0; - cfg_size =3D sizeof(vdev->config.net); - break; - case VIRTIO_ID_BLOCK: - vdev->nr_vqs =3D 1; - vdev->cmd_vr_idx =3D 0; - cfg_size =3D sizeof(vdev->config.blk); - break; - case VIRTIO_ID_SCSI: - vdev->nr_vqs =3D 3; - vdev->cmd_vr_idx =3D VR_REQUEST; - cfg_size =3D sizeof(vdev->config.scsi); - break; - default: - puts("Unsupported virtio device"); - return -ENODEV; - } - - status |=3D VIRTIO_CONFIG_S_DRIVER; - if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { - puts("Could not write DRIVER status to host"); - return -EIO; - } - - /* Feature negotiation */ - for (i =3D 0; i < ARRAY_SIZE(vdev->guest_features); i++) { - feats.features =3D 0; - feats.index =3D i; - if (run_ccw(vdev, CCW_CMD_READ_FEAT, &feats, sizeof(feats), false)= ) { - puts("Could not get features bits"); - return -EIO; - } - - vdev->guest_features[i] &=3D bswap32(feats.features); - feats.features =3D bswap32(vdev->guest_features[i]); - if (run_ccw(vdev, CCW_CMD_WRITE_FEAT, &feats, sizeof(feats), false= )) { - puts("Could not set features bits"); - return -EIO; - } - } - - if (run_ccw(vdev, CCW_CMD_READ_CONF, &vdev->config, cfg_size, false)) { - puts("Could not get virtio device configuration"); - return -EIO; - } - - for (i =3D 0; i < vdev->nr_vqs; i++) { - VqInfo info =3D { - .queue =3D (unsigned long long) ring_area + (i * VIRTIO_RING_S= IZE), - .align =3D KVM_S390_VIRTIO_RING_ALIGN, - .index =3D i, - .num =3D 0, - }; - VqConfig config =3D { - .index =3D i, - .num =3D 0, - }; - - if (run_ccw(vdev, CCW_CMD_READ_VQ_CONF, &config, sizeof(config), - false)) { - puts("Could not get virtio device VQ config"); - return -EIO; - } - info.num =3D config.num; - vring_init(&vdev->vrings[i], &info); - vdev->vrings[i].schid =3D vdev->schid; - if (run_ccw(vdev, CCW_CMD_SET_VQ, &info, sizeof(info), false)) { - puts("Cannot set VQ info"); - return -EIO; - } - } - - status |=3D VIRTIO_CONFIG_S_DRIVER_OK; - if (run_ccw(vdev, CCW_CMD_WRITE_STATUS, &status, sizeof(status), false= )) { - puts("Could not write DRIVER_OK status to host"); - return -EIO; - } - - return 0; + return -1; } =20 bool virtio_is_supported(SubChannelId schid) @@ -347,12 +201,17 @@ bool virtio_is_supported(SubChannelId schid) true)) { return false; } + + vdev.type =3D vdev.senseid.cu_model; + if (vdev.senseid.cu_type =3D=3D 0x3832) { - switch (vdev.senseid.cu_model) { + switch (vdev.type) { case VIRTIO_ID_BLOCK: case VIRTIO_ID_SCSI: case VIRTIO_ID_NET: return true; + default: + return false; } } return false; diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index a0f24c94a8..3577ac381a 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -34,7 +34,8 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d .PHONY : all clean build-all distclean =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ - virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o + virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o= \ + virtio-ccw.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.49.0 From nobody Fri Nov 14 16:55:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1760977347; cv=none; d=zohomail.com; s=zohoarc; b=gCwh0SHtoN+8akuAyUgUyymVEICPsXSS/6lHgPFLHXlgQOQLBPN9FZFPEaXdf7W1n2MTb7VpGvd7M1BRSi1ZMC/5VTcUAa8wW9cFylhvbV5shXLbScdtmYPZaqKZxHA1hRIiu1zQQqNZmsW5cmLKWN/nEG/zsWDHx/SskbspyaE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760977347; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=fuuANGqPQMbYTgFcNf4ybcycvExWfEtGEzuckzyU/xo=; b=jFnHY4lEkVI9haPSwKsiV5N2d3VkYbpvQU0N3PECDlp89XC8Br+Z3jz/jww0KOmBjhgnA1uPQnKio2i9nCsMX8b/BfxMPQMgDOF3sainwDcbXfG5/Qz26CdML7Mby+AqcFffbng+2OdHMJ7nzHWZgIjphiHp0dFpHuj595Lyzy0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760977347266238.18571394962737; Mon, 20 Oct 2025 09:22:27 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAscj-0003j6-DF; Mon, 20 Oct 2025 12:20:41 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAscf-0003gy-VP; Mon, 20 Oct 2025 12:20:38 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAscd-0000sP-JU; Mon, 20 Oct 2025 12:20:37 -0400 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59KFNawE013009; Mon, 20 Oct 2025 16:20:34 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v31c1e30-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:33 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59KE09Gg014685; Mon, 20 Oct 2025 16:20:33 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vn7rxrqr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:33 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay07.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59KGKWOh6685296 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Oct 2025 16:20:32 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 19DB758067; Mon, 20 Oct 2025 16:20:32 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4694E58065; Mon, 20 Oct 2025 16:20:31 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.78.141]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Oct 2025 16:20:31 +0000 (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=fuuANGqPQMbYTgFcN f4ybcycvExWfEtGEzuckzyU/xo=; b=G+4Qi4IB0nMElkZnxkRHtg6SbPnA4LjnK xOp/fImA1MUgWb+G3wS30wLNG8tKV9BDGFa5eSEgZq2JSAV7Il1Zpp8z5cP7YTxk kJTgHY2oA2wufWkToIWbfok/KOJITDE6WjXHWCd3p+C89DbYD2esbQPq32fQWA2Y yz28M08OOF0Q58JQrYV6uP50H/vyhDLn+WvI9F72+qQ7BebagE3EWdoBkB5gbQPn b1oc/DglBX/FNE6pCy3GmYKB2KGc4lo8gZfEVn7VvKcyHKH2vQHI97SLS/t3vEAe caltaVO8xTIcIOKsGYToysjU7hK88oYZWBZk1Pv5LOyM++DCfcC+A== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com Cc: jjherne@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, mjrosato@linux.ibm.com, jrossi@linux.ibm.com, zycai@linux.ibm.com Subject: [PATCH 3/7] pc-bios/s390-ccw: Introduce CLP Architecture Date: Mon, 20 Oct 2025 12:20:19 -0400 Message-ID: <20251020162023.3649165-4-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251020162023.3649165-1-jrossi@linux.ibm.com> References: <20251020162023.3649165-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: OQPkbTRD8irdY8VpwRP8berbbGQGncZ6 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX/jkiGFz4wmI1 VwYjNgWyrHih7RXNQSNpjHes4vNyRj4wC5dwcaOZM9qkUGN3lK2L6rwfoRLc3MYX3bs9ahb/M8a g43E5waYUTixGE8xD5TGXNfoo496Nkko3TlnMUrJi8MBzV8Y+YkA4FGbKZO9sGJIjStTTnCU5m/ RoPeX3ceIWOPgySLBW8ZDISe7UuSpnNSxNiFD4X7x8ICoEfdkF1JRz/SHy8IfbKjt/zW0N0i7Fo g8S7qeQZyOHlKjJ2ZH1W/UdqVKEjtkZ+7bS2XGPJNBTNmlVaGD4q/dOsRf9448DnR89uP4dlZuk oPIF42wgPFoy8fGS4h0jGbZNbE+YVfB9pgoQJ/I/ZpsXjeRBKhZT5jubmmLFAUKN9T3Vni8nBuC WqLuDJenmekHXiYN0rPPsD1r8zVGbQ== X-Proofpoint-GUID: OQPkbTRD8irdY8VpwRP8berbbGQGncZ6 X-Authority-Analysis: v=2.4 cv=SKNPlevH c=1 sm=1 tr=0 ts=68f66151 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=B6FfjjnMrpp8agTJrekA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-20_04,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 suspectscore=0 clxscore=1015 priorityscore=1501 spamscore=0 impostorscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=jrossi@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1760977349701154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Call Logical Processor (CLP) Architecture is used for managing PCI function= s on s390x. Define and include the structures and routines needed to interact wi= th PCI devices during IPL. Headers in ~/qemu/include/hw are not normally visible and must be included using a relative path. Due to this, the QEMU_PACKED macro must also be def= ined here. Signed-off-by: Jared Rossi --- pc-bios/s390-ccw/clp.h | 24 +++++++++ pc-bios/s390-ccw/clp.c | 106 ++++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/Makefile | 2 +- 3 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 pc-bios/s390-ccw/clp.h create mode 100644 pc-bios/s390-ccw/clp.c diff --git a/pc-bios/s390-ccw/clp.h b/pc-bios/s390-ccw/clp.h new file mode 100644 index 0000000000..cb130e5e90 --- /dev/null +++ b/pc-bios/s390-ccw/clp.h @@ -0,0 +1,24 @@ +/* + * Call Logical Processor (CLP) architecture definitions + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef CLP_H +#define CLP_H + +#ifndef QEMU_PACKED +#define QEMU_PACKED __attribute__((packed)) +#endif + +#include +#include "../../include/hw/s390x/s390-pci-clp.h" + +int clp_pci(void *data); +int enable_pci_function(uint32_t *fhandle); +int enumerate_pci_functions(void); + +#endif diff --git a/pc-bios/s390-ccw/clp.c b/pc-bios/s390-ccw/clp.c new file mode 100644 index 0000000000..45d496fc18 --- /dev/null +++ b/pc-bios/s390-ccw/clp.c @@ -0,0 +1,106 @@ +/* + * Call Logical Processor (CLP) architecture + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "clp.h" +#include +#include + +int clp_pci(void *data) +{ + struct { uint8_t _[2048]; } *req =3D data; + int cc =3D 3; + + asm volatile ( + " .insn rrf,0xb9a00000,0,%[req],0,2\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "+d" (cc), "+m" (*req) + : [req] "a" (req) + : "cc"); + return cc; +} + +/* + * Get the PCI function entry for a given function ID + * Return 0 on success, 1 if the FID is not found, or a negative RC on err= or + */ +int find_pci_function(uint32_t fid, ClpFhListEntry *entry) +{ + int rc; + int count =3D 0; + int limit =3D PCI_MAX_FUNCTIONS; + ClpReqRspListPci rrb; + + rrb.request.hdr.len =3D 32; + rrb.request.hdr.cmd =3D 0x02; + rrb.request.resume_token =3D 0; + rrb.response.hdr.len =3D sizeof(ClpRspListPci); + + do { + rc =3D clp_pci(&rrb); + if (rc) { + return -rc; + } + + if (rrb.response.hdr.rsp !=3D 0x0010) { + printf("Failed to list PCI functions: %x", rrb.response.hdr.rs= p); + return -1; + } + + /* Resume token set when max enteries are returned */ + if (rrb.response.resume_token) { + count =3D CLP_FH_LIST_NR_ENTRIES; + rrb.request.resume_token =3D rrb.response.resume_token; + } else { + count =3D (rrb.response.hdr.len - 32) / sizeof(ClpFhListEntry); + } + + limit -=3D count; + + for (int i =3D 0; i < count; i++) { + if (rrb.response.fh_list[i].fid =3D=3D fid) { + memcpy(entry, &rrb.response.fh_list[i], sizeof(ClpFhListEn= try)); + return 0; + } + } + + } while (rrb.request.resume_token && limit); + + return 1; +} + +/* + * Enable the PCI function associated with a given handle + * Return 0 on success or a negative RC on error + */ +int enable_pci_function(uint32_t *fhandle) +{ + ClpReqRspSetPci rrb; + int rc; + + rrb.request.hdr.len =3D 32; + rrb.request.hdr.cmd =3D 0x05; + rrb.request.fh =3D *fhandle; + rrb.request.oc =3D 0; + rrb.request.ndas =3D 1; + rrb.response.hdr.len =3D 32; + + rc =3D clp_pci(&rrb); + if (rc) { + return -rc; + } + + if (rrb.response.hdr.rsp !=3D 0x0010) { + printf("Failed to enable PCI function: %x", rrb.response.hdr.rsp); + return -1; + } + + *fhandle =3D rrb.response.fh; + return 0; +} diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 3577ac381a..89a42ae506 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -35,7 +35,7 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o= \ - virtio-ccw.o + virtio-ccw.o clp.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.49.0 From nobody Fri Nov 14 16:55:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1760977293; cv=none; d=zohomail.com; s=zohoarc; b=O0HMEJWT2F8ESzqZYjjQytORd8N2/SP01MvHnri4NeuQMSJgCl3o7MLDkQqhCGgq200Ml1A+yGplr5e5fWkJz6Ax5sRbq/KodQJdX7RtVB3YtwGm6j9XtCg6MGOK+ghzaMk4bsTAabTx36bz9hFoCIkMJCBPu4HDAq3gCSEcS6Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760977293; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7dewvaRSqeMbVtAS3xQlODzV1Ib0tyTeVwjFS/WUHtI=; b=YuypIwgJ2LnnrHIDygYJ2Rclo/9D0Nr/OfX408XprU8ndCU45Lvlq+7xP4ZSP4ofc0CLby5/PvayUYTYYJ4iY6iYQbBlrzsXVS+Cs2pwe+Ach+/8hGzIXRYVVVA2HcQC70uUicZlDm3HdYziX84uPARDzFd6nplnCbMCBMoIG9Q= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760977293476915.6906313721815; Mon, 20 Oct 2025 09:21:33 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAscn-0003k7-4s; Mon, 20 Oct 2025 12:20:45 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAsci-0003iZ-Jr; Mon, 20 Oct 2025 12:20:40 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAscg-0000su-88; Mon, 20 Oct 2025 12:20:40 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59K7Jg8m025774; Mon, 20 Oct 2025 16:20:37 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v32h9b8x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:36 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59KFKYQf002320; Mon, 20 Oct 2025 16:20:35 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vqej6bra-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:35 +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 59KGKXkC50004272 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Oct 2025 16:20:34 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9DE6C5806A; Mon, 20 Oct 2025 16:20:33 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0635E58065; Mon, 20 Oct 2025 16:20:33 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.78.141]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Oct 2025 16:20:32 +0000 (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=7dewvaRSqeMbVtAS3 xQlODzV1Ib0tyTeVwjFS/WUHtI=; b=k6ZjThf2UCehHzvXwHkqEDItMspJtiEUi jl7SHOsNVawdFSJQmeieDHA6APedl8RC7ZOsLhprS4VPYX+EmYyLXXcOtMWSiEvk 4AhdDCfrOhadDBHjJuSJTplYjmqWdkIGYk/IqdTeNPKPzsnRgbFH62ki6wAdQZ8X cHGuprI3S9hFRLaWroQwIjPK8GBBoaWJMADh630PRRtt11/i2+I4t0pwXcnWx7VM tNKYpucnCdu4DQS6zeaY41A8eubeelbpM1WbJewuNoVP5TjcCQbfvtG5fV2Mp8Xz nRt/H6jn0e+Kam/Ae7YVM0uBFg0/5f0udPVO9ba9m7cQQhyYecuAA== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com Cc: jjherne@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, mjrosato@linux.ibm.com, jrossi@linux.ibm.com, zycai@linux.ibm.com Subject: [PATCH 4/7] pc-bios/s390-ccw: Introduce PCI device IPL format Date: Mon, 20 Oct 2025 12:20:20 -0400 Message-ID: <20251020162023.3649165-5-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251020162023.3649165-1-jrossi@linux.ibm.com> References: <20251020162023.3649165-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX1RUTUM/nsCIu kwfu7WtQtkxAJG+RfQe6nRUcKHufm4m3uMUI3mpJ0fVclYkh+jRYHj8QkJFpoLfgwXMi1/mhFgx YsUKF+28Urj1V13D26h5XRF1o3Ls+2Fb2mLP1pm9S88xjE0gORt65iiIkn5mPg/Yq9+Inn/rgdJ rLRjJ37tBvJub9APWNDit8CKppRtljAv0lDw7IAi3mPedXHU6WH8PuJrU92IzifpydxOf004igb I9VWAGRCuLUhwCxHGub4Zv69WrGWC2yYjrLEo6mnSTCNb4qZq+L246QfdTCcdvh5C5k7e3yUo/O ytCtZvcey6Hb3RTwqwPBdM+g99w00RtszsdhuM6+YPYfZ6NNabUkO2uN6vhPKTkEIvnycHQ1m88 BadVQYmT9j+Uhgc657Sr9Jj2nCWkyg== X-Authority-Analysis: v=2.4 cv=OrVCCi/t c=1 sm=1 tr=0 ts=68f66154 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=WVVyr85AwjsCaWk6uVoA:9 X-Proofpoint-GUID: 5gyt6_4q8d7toDRzPnYLcQbeSksvy5Eg X-Proofpoint-ORIG-GUID: 5gyt6_4q8d7toDRzPnYLcQbeSksvy5Eg X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-20_04,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 adultscore=0 priorityscore=1501 spamscore=0 phishscore=0 clxscore=1015 bulkscore=0 malwarescore=0 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=jrossi@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1760977295516158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Define selected s390x PCI instructions and extend IPLB to allow PCI devices. Signed-off-by: Jared Rossi --- include/hw/s390x/ipl/qipl.h | 9 ++ pc-bios/s390-ccw/pci.h | 77 +++++++++++++++ pc-bios/s390-ccw/pci.c | 191 ++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/Makefile | 2 +- 4 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 pc-bios/s390-ccw/pci.h create mode 100644 pc-bios/s390-ccw/pci.c diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index aadab87c2e..efd7b3797c 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -104,6 +104,14 @@ struct IplBlockQemuScsi { } QEMU_PACKED; typedef struct IplBlockQemuScsi IplBlockQemuScsi; =20 +struct IplBlockPci { + uint32_t reserved0[80]; + uint8_t opt; + uint8_t reserved1[3]; + uint32_t fid; +} QEMU_PACKED; +typedef struct IplBlockPci IplBlockPci; + union IplParameterBlock { struct { uint32_t len; @@ -119,6 +127,7 @@ union IplParameterBlock { IplBlockFcp fcp; IPLBlockPV pv; IplBlockQemuScsi scsi; + IplBlockPci pci; }; } QEMU_PACKED; struct { diff --git a/pc-bios/s390-ccw/pci.h b/pc-bios/s390-ccw/pci.h new file mode 100644 index 0000000000..b5dc5bff35 --- /dev/null +++ b/pc-bios/s390-ccw/pci.h @@ -0,0 +1,77 @@ +/* + * s390x PCI definitions + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef PCI_H +#define PCI_H + +#include +#include "clp.h" + +#define ZPCI_CREATE_REQ(handle, space, len) \ + ((uint64_t) handle << 32 | space << 16 | len) + +union register_pair { + unsigned __int128 pair; + struct { + unsigned long even; + unsigned long odd; + }; +}; + +#define PCIFIB_FC_ENABLED 0x80 +#define PCIFIB_FC_ERROR 0x40 +#define PCIFIB_FC_BLOCKED 0x20 +#define PCIFIB_FC_DMAREG 0x10 + +#define PCIST_DISABLED 0x0 +#define PCIST_ENABLED 0x1 + +#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list ent= ry */ + +struct PciFib { + uint32_t reserved0[2]; + uint8_t fcflags; + uint8_t reserved1[3]; + uint32_t reserved2; + uint64_t pba; + uint64_t pal; + uint64_t iota; + uint16_t isc:4; + uint16_t noi:12; + uint8_t reserved3:2; + uint8_t aibvo:6; + uint8_t s:1; + uint8_t reserved4:1; + uint8_t aisbo:6; + uint32_t reserved5; + uint64_t aibv; + uint64_t aisb; + uint64_t fmba; + uint32_t reserved6[2]; +}; +typedef struct PciFib PciFib; + +struct PciDevice { + uint16_t device_id; + uint16_t vendor_id; + uint32_t fid; + uint32_t fhandle; + uint8_t status; + PciFib fib; +}; +typedef struct PciDevice PciDevice; + +int pci_write(uint32_t fhandle, uint64_t offset, uint64_t data, uint8_t le= n); +int pci_read(uint32_t fhandle, uint64_t offset, uint8_t picas, void *buf, = uint8_t len); +uint8_t find_cap_pos(uint32_t fhandle, uint64_t cfg_type); +int pci_dev_enable(PciDevice *pcidev); +int get_fib(PciFib *fib, uint32_t fhandle); +int set_fib(PciFib *fib, uint32_t fhandle, uint8_t dma_as, uint8_t opcontr= ol); + +#endif diff --git a/pc-bios/s390-ccw/pci.c b/pc-bios/s390-ccw/pci.c new file mode 100644 index 0000000000..f776bc064c --- /dev/null +++ b/pc-bios/s390-ccw/pci.c @@ -0,0 +1,191 @@ +/* + * s390x PCI funcionality + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "clp.h" +#include "pci.h" +#include + +/* PCI load */ +static inline int pcilg(uint64_t *data, uint64_t req, uint64_t offset, uin= t8_t *status) +{ + union register_pair req_off =3D {.even =3D req, .odd =3D offset}; + int cc =3D -1; + uint64_t __data =3D 0x92; + + asm volatile ( + " .insn rre,0xb9d20000,%[data],%[req_off]\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "+d" (cc), [data] "=3Dd" (__data), + [req_off] "+&d" (req_off.pair) :: "cc"); + *status =3D req_off.even >> 24 & 0xff; + *data =3D __data; + return cc; +} + +/* PCI store */ +int pcistg(uint64_t data, uint64_t req, uint64_t offset, uint8_t *status) +{ + union register_pair req_off =3D {.even =3D req, .odd =3D offset}; + int cc =3D -1; + + asm volatile ( + " .insn rre,0xb9d00000,%[data],%[req_off]\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "+d" (cc), [req_off] "+&d" (req_off.pair) + : [data] "d" (data) + : "cc"); + *status =3D req_off.even >> 24 & 0xff; + return cc; +} + +/* store PCI function controls */ +int stpcifc(uint64_t req, PciFib *fib, uint8_t *status) +{ + uint8_t cc; + + asm volatile ( + " .insn rxy,0xe300000000d4,%[req],%[fib]\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "=3Dd" (cc), [req] "+d" (req), [fib] "+Q" (*fib) + : : "cc"); + *status =3D req >> 24 & 0xff; + return cc; +} + +/* modify PCI function controls */ +int mpcifc(uint64_t req, PciFib *fib, uint8_t *status) +{ + uint8_t cc; + + asm volatile ( + " .insn rxy,0xe300000000d0,%[req],%[fib]\n" + " ipm %[cc]\n" + " srl %[cc],28\n" + : [cc] "=3Dd" (cc), [req] "+d" (req), [fib] "+Q" (*fib) + : : "cc"); + *status =3D req >> 24 & 0xff; + return cc; +} + +int pci_write(uint32_t fhandle, uint64_t offset, uint64_t data, uint8_t le= n) +{ + + uint64_t req =3D ZPCI_CREATE_REQ(fhandle, 4, len); + uint8_t status; + int rc; + + rc =3D pcistg(data, req, offset, &status); + if (rc =3D=3D 1) { + return status; + } else if (rc) { + return rc; + } + + return 0; +} + +int pci_read(uint32_t fhandle, uint64_t offset, uint8_t picas, void *buf, = uint8_t len) +{ + uint64_t req; + uint64_t data; + uint8_t status; + int readlen; + int i =3D 0; + int rc =3D 0; + + while (len > 0 && !rc) { + data =3D 0; + readlen =3D len > 8 ? 8 : len; + req =3D ZPCI_CREATE_REQ(fhandle, picas, readlen); + rc =3D pcilg(&data, req, offset + (i * 8), &status); + ((uint64_t *)buf)[i] =3D data; + len -=3D readlen; + i++; + } + + if (rc =3D=3D 1) { + return status; + } else if (rc) { + return rc; + } + + return 0; +} + +/* + * Find the position of the capability config within PCI configuration + * space for a given cfg type. Return the position if found, otherwise 0. + */ +uint8_t find_cap_pos(uint32_t fhandle, uint64_t cfg_type) { + uint64_t req, next, cfg; + uint8_t status; + int rc; + + req =3D ZPCI_CREATE_REQ(fhandle, 0xf, 1); + rc =3D pcilg(&next, req, PCI_CAPABILITY_LIST, &status); + rc =3D pcilg(&cfg, req, next + 3, &status); + + while (!rc && (cfg !=3D cfg_type) && next) { + rc =3D pcilg(&next, req, next + 1, &status); + rc =3D pcilg(&cfg, req, next + 3, &status); + } + + return rc ? 0 : next; +} + +int pci_dev_enable(PciDevice *pcidev) +{ + int rc; + + rc =3D enable_pci_function(&pcidev->fhandle); + if (rc) { + return rc; + } + + pcidev->status =3D PCIST_ENABLED; + + return get_fib(&pcidev->fib, pcidev->fhandle); +} + +int get_fib(PciFib *fib, uint32_t fhandle) +{ + uint64_t req =3D ZPCI_CREATE_REQ(fhandle, 0, 0); + uint8_t status; + int rc; + + rc =3D stpcifc(req, fib, &status); + + if (rc =3D=3D 1) { + return status; + } else if (rc) { + return rc; + } + + return 0; +} + +int set_fib(PciFib *fib, uint32_t fhandle, uint8_t dma_as, uint8_t opcontr= ol) +{ + uint64_t req =3D ZPCI_CREATE_REQ(fhandle, dma_as, opcontrol); + uint8_t status; + int rc; + + rc =3D mpcifc(req, fib, &status); + + if (rc =3D=3D 1) { + return status; + } else if (rc) { + return rc; + } + + return 0; +} diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 89a42ae506..1f17f98fc1 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -35,7 +35,7 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o= \ - virtio-ccw.o clp.o + virtio-ccw.o clp.o pci.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.49.0 From nobody Fri Nov 14 16:55:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1760977338; cv=none; d=zohomail.com; s=zohoarc; b=n1YCmNly4rvuH2CJMdp9OMKoU0UTpQlhIKU7FzWWN+RFFXZBcE/30d/FRiuohrsJ579JF40eTu2ua0HwuXmYVyOBPbKAh6H+tTrX3z4TYNosVO3BtqYprkMuSO9Qsa5yQZNgkapyECzzd4tXghhXJBZImUlmPVjydfETMkXZc+c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760977338; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=s69IrhSy7IoKpJv12smthmV3ue0ebcyT7BZnXMXeGUY=; b=gR/FrNkVYXwC9jKYdbpYSt8p3owNuJc2Rm+79oIFWgMlVG5Paf9J1Gw1j0+vd8nFHYvk314kCBVj74IIpda7V0ybx2nD/tXiGMXvwL7xQ0lR0AxiJhh0MQYs+FaCWtqOglA61NLaUY+oVqFSjU5iCHx8VFK9stI4eLFgwYv5Zh4= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760977338882469.00232158776885; Mon, 20 Oct 2025 09:22:18 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAscr-0003mD-DR; Mon, 20 Oct 2025 12:20:50 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAsck-0003jZ-GT; Mon, 20 Oct 2025 12:20:42 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAsch-0000t6-IH; Mon, 20 Oct 2025 12:20:42 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59KC2fg3006614; Mon, 20 Oct 2025 16:20:38 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326jg1k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:37 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59KEgxOo032096; Mon, 20 Oct 2025 16:20:36 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49vp7mph79-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:36 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay02.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59KGKZ1I15467154 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Oct 2025 16:20:35 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 354085805D; Mon, 20 Oct 2025 16:20:35 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 888B258052; Mon, 20 Oct 2025 16:20:34 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.78.141]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Oct 2025 16:20:34 +0000 (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=s69IrhSy7IoKpJv12 smthmV3ue0ebcyT7BZnXMXeGUY=; b=XfZYpVDODc8jbyIz8ECH1zaYFB2lLUK3r PNtLsDbs7apbK5jQBH/nSUdf73uos8h19cPxmL5AQ3kxSoOrlQbRT8WmVUILeodh lY07fGX6w7lfUZbb6tMnXFsFzrYquob6tMWBYhU//FM9YoV2+foCzmeLAZphQab9 unjalpsle+IgSabbHdE4/FjQ4ho+S3TvHsHuhvLLrRwflNqG2VLZzkIAFjk/UIdm ZfBc4yFw7WfIQGI6MKd5DvGgKrqFyRQC1venFkpO7oIK5SophWHyIeusCChcEgor HdCinM8TuELK12PXkWWHi/3JrglmqndcD/FzC7+0m4D4KY8Q052Ug== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com Cc: jjherne@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, mjrosato@linux.ibm.com, jrossi@linux.ibm.com, zycai@linux.ibm.com Subject: [PATCH 5/7] pc-bios/s390-ccw: Add support for virtio-blk-pci IPL Date: Mon, 20 Oct 2025 12:20:21 -0400 Message-ID: <20251020162023.3649165-6-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251020162023.3649165-1-jrossi@linux.ibm.com> References: <20251020162023.3649165-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=EJELElZC c=1 sm=1 tr=0 ts=68f66155 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=IFyg070M5ZGC1bApo04A:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfXwMssPJ2FGpJd aOnomox9OGd7vBQV6VlQcGRWTt1l/vki8dU3bh1VDGutJ9DlLjcdqZdgMJejgC8Z2obXBLdYRdO UfpVjiy6dJCoYfJZwTFFJUXE2MPMsDC3Ve+Jn69ZL5ejaxMy4Bblq+jeqqysMHdRW6zo89psnmk lFedoFojjc9S28qmqGoZQ41uQPP5Ey+8XHOhIs/o1XH9MPkgRGmi+iAWeDf8ckLUdIQQ+M8G6Aa DV4GFvFPVgMRryjCJbPPeC7SMDiF3DNBLxVniPHGk/XIWv7fsT7pt+IYIC2ujdRq2/0pYjOwLfd seefV4uZs3g7b1vmX6V2eIwO5KAQ7YJxaj/7AZxg8D1ea40A3Dsw0NiM/rKBcTNyFxA+LtrTK7p iLEBo3I0MKWB7gX3mBARz37nswIQ8A== X-Proofpoint-GUID: ioaRqS4mle85IvG-8eUwUjXZfXtokjGq X-Proofpoint-ORIG-GUID: ioaRqS4mle85IvG-8eUwUjXZfXtokjGq X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-20_04,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 spamscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=jrossi@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1760977341542154100 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Enable virt-queue PCI configuration and add routines for virtio-blk-pci dev= ices. Signed-off-by: Jared Rossi --- pc-bios/s390-ccw/clp.h | 2 +- pc-bios/s390-ccw/virtio-pci.h | 73 +++++++ pc-bios/s390-ccw/virtio.h | 1 + pc-bios/s390-ccw/main.c | 59 ++++- pc-bios/s390-ccw/virtio-blkdev.c | 3 + pc-bios/s390-ccw/virtio-pci.c | 357 +++++++++++++++++++++++++++++++ pc-bios/s390-ccw/virtio.c | 5 + pc-bios/s390-ccw/Makefile | 2 +- 8 files changed, 498 insertions(+), 4 deletions(-) create mode 100644 pc-bios/s390-ccw/virtio-pci.h create mode 100644 pc-bios/s390-ccw/virtio-pci.c diff --git a/pc-bios/s390-ccw/clp.h b/pc-bios/s390-ccw/clp.h index cb130e5e90..52232c4c48 100644 --- a/pc-bios/s390-ccw/clp.h +++ b/pc-bios/s390-ccw/clp.h @@ -19,6 +19,6 @@ =20 int clp_pci(void *data); int enable_pci_function(uint32_t *fhandle); -int enumerate_pci_functions(void); +int find_pci_function(uint32_t fid, ClpFhListEntry *entry); =20 #endif diff --git a/pc-bios/s390-ccw/virtio-pci.h b/pc-bios/s390-ccw/virtio-pci.h new file mode 100644 index 0000000000..09fff015cb --- /dev/null +++ b/pc-bios/s390-ccw/virtio-pci.h @@ -0,0 +1,73 @@ +/* + * Definitions for virtio-pci + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef VIRTIO_PCI_H +#define VIRTIO_PCI_H + +/* Common configuration */ +#define VIRTIO_PCI_CAP_COMMON_CFG 1 +/* Notifications */ +#define VIRTIO_PCI_CAP_NOTIFY_CFG 2 +/* ISR access */ +#define VIRTIO_PCI_CAP_ISR_CFG 3 +/* Device specific configuration */ +#define VIRTIO_PCI_CAP_DEVICE_CFG 4 +/* PCI configuration access */ +#define VIRTIO_PCI_CAP_PCI_CFG 5 +/* Additional shared memory capability */ +#define VIRTIO_PCI_CAP_SHARED_MEMORY_CFG 8 +/* PCI vendor data configuration */ +#define VIRTIO_PCI_CAP_VENDOR_CFG 9 + +/* Offsets within capability header */ +#define VIRTIO_PCI_CAP_VNDR 0 +#define VIRTIO_PCI_CAP_NEXT 1 +#define VIRTIO_PCI_CAP_LEN 2 +#define VIRTIO_PCI_CAP_CFG_TYPE 3 +#define VIRTIO_PCI_CAP_BAR 4 +#define VIRTIO_PCI_CAP_OFFSET 8 +#define VIRTIO_PCI_CAP_LENGTH 12 + +#define VIRTIO_PCI_NOTIFY_CAP_MULT 16 /* VIRTIO_PCI_CAP_NOTIFY_CFG only */ + +/* Common Area Offsets for virtio-pci queue */ +#define VPCI_C_OFFSET_DFSELECT 0 +#define VPCI_C_OFFSET_DF 4 +#define VPCI_C_OFFSET_GFSELECT 8 +#define VPCI_C_OFFSET_GF 12 +#define VPCI_C_COMMON_NUMQ 18 +#define VPCI_C_OFFSET_STATUS 20 +#define VPCI_C_OFFSET_Q_SELECT 22 +#define VPCI_C_OFFSET_Q_SIZE 24 +#define VPCI_C_OFFSET_Q_ENABLE 28 +#define VPCI_C_OFFSET_Q_NOFF 30 +#define VPCI_C_OFFSET_Q_DESCLO 32 +#define VPCI_C_OFFSET_Q_DESCHI 36 +#define VPCI_C_OFFSET_Q_AVAILLO 40 +#define VPCI_C_OFFSET_Q_AVAILHI 44 +#define VPCI_C_OFFSET_Q_USEDLO 48 +#define VPCI_C_OFFSET_Q_USEDHI 52 + +#define VPCI_S_RESET 0 +#define VPCI_S_ACKNOWLEDGE 1 +#define VPCI_S_DRIVER 2 +#define VPCI_S_DRIVER_OK 4 +#define VPCI_S_FEATURES_OK 8 + +#define VIRTIO_F_VERSION_1 (1 << (32 - 32)) /* Feature bit 32 */ + +#define VIRT_Q_SIZE 16 + +long virtio_pci_notify(uint32_t fhandle, int vq_id); +int virtio_pci_setup(VDev *vdev); +int virtio_pci_setup_device(void); +int virtio_pci_reset(VDev *vdev); +void virtio_pci_id2type(VDev *vdev, uint16_t device_id); + +#endif diff --git a/pc-bios/s390-ccw/virtio.h b/pc-bios/s390-ccw/virtio.h index 1c1017a0db..4e4a7280b6 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -259,6 +259,7 @@ struct VDev { uint8_t scsi_dev_heads; bool scsi_device_selected; ScsiDevice selected_scsi_device; + uint32_t pci_fh; uint32_t max_transfer; uint32_t guest_features[2]; }; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 7299b8911f..69e7d39862 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -15,8 +15,10 @@ #include "s390-arch.h" #include "s390-ccw.h" #include "cio.h" +#include "clp.h" #include "virtio.h" #include "virtio-scsi.h" +#include "virtio-pci.h" #include "dasd-ipl.h" =20 SubChannelId blk_schid =3D { .one =3D 1 }; @@ -150,6 +152,20 @@ static bool find_subch(int dev_no) return false; } =20 +static bool find_fid(uint32_t fid) { + ClpFhListEntry entry; + VDev *vdev =3D virtio_get_device(); + + if (find_pci_function(fid, &entry)) { + return false; + } + + vdev->pci_fh =3D entry.fh; + virtio_pci_id2type(vdev, entry.device_id); + + return (vdev->type !=3D 0); +} + static void menu_setup(void) { if (memcmp(loadparm_str, LOADPARM_PROMPT, LOADPARM_LEN) =3D=3D 0) { @@ -233,6 +249,9 @@ static bool find_boot_device(void) blk_schid.ssid =3D iplb.scsi.ssid & 0x3; found =3D find_subch(iplb.scsi.devno); break; + case S390_IPL_TYPE_PCI: + found =3D find_fid(iplb.pci.fid); + break; default: puts("Unsupported IPLB"); } @@ -269,7 +288,7 @@ static int virtio_setup(void) return ret; } =20 -static void ipl_boot_device(void) +static void ipl_ccw_device(void) { switch (cutype) { case CU_TYPE_DASD_3990: @@ -282,7 +301,43 @@ static void ipl_boot_device(void) } break; default: - printf("Attempting to boot from unexpected device type 0x%X\n", cu= type); + printf("Cannot boot CCW device with cu type 0x%X\n", cutype); + } +} + +static void ipl_pci_device(void) +{ + VDev *vdev =3D virtio_get_device(); + vdev->is_cdrom =3D false; + vdev->scsi_device_selected =3D false; + + if (virtio_pci_setup_device()) { + return; + } + + switch (vdev->type) { + case VIRTIO_ID_BLOCK: + if (virtio_setup() =3D=3D 0) { + zipl_load(); + } + break; + default: + printf("Cannot boot PCI device type 0x%X\n", vdev->type); + } +} + +static void ipl_boot_device(void) +{ + switch (ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + ipl_ccw_device(); + break; + case S390_IPL_TYPE_PCI: + ipl_pci_device(); + break; + default: + puts("Unrecognized IPL type!"); } } =20 diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index df6a6d5b70..c5b65d021b 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -13,6 +13,7 @@ #include "virtio.h" #include "virtio-ccw.h" #include "virtio-scsi.h" +#include "virtio-pci.h" =20 #define VIRTIO_BLK_F_GEOMETRY (1 << 4) #define VIRTIO_BLK_F_BLK_SIZE (1 << 6) @@ -243,6 +244,8 @@ int virtio_blk_setup_device() case S390_IPL_TYPE_CCW: vdev->schid =3D blk_schid; return virtio_ccw_setup(vdev); + case S390_IPL_TYPE_PCI: + return virtio_pci_setup(vdev); } =20 return 1; diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c new file mode 100644 index 0000000000..b6cb4a661a --- /dev/null +++ b/pc-bios/s390-ccw/virtio-pci.c @@ -0,0 +1,357 @@ +/* + * Functionality for virtio-pci + * + * Copyright 2025 IBM Corp. + * Author(s): Jared Rossi + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "clp.h" +#include "pci.h" +#include "helper.h" +#include "s390-ccw.h" +#include "virtio.h" +#include "bswap.h" +#include "virtio-pci.h" +#include "s390-time.h" +#include + +/* Variable offsets used for reads/writes to modern memory region BAR 4 */ +uint32_t common_offset; +uint32_t device_offset; +uint32_t notify_offset; +uint32_t notify_mult; +uint16_t q_notify_offset; + +static int virtio_pci_set_status(VDev *vdev, uint8_t status) +{ + uint64_t status64 =3D status; + + return pci_write(vdev->pci_fh, VPCI_C_OFFSET_STATUS, status64, 1); +} + +static int virtio_pci_get_status(VDev *vdev, uint8_t *status) +{ + uint64_t status64; + int rc; + + rc =3D pci_read(vdev->pci_fh, VPCI_C_OFFSET_STATUS, 4, &status64, 1); + if (rc) { + puts("Failed to read virtio-pci status"); + return rc; + } + + *status =3D (uint8_t) status64; + return 0; +} + +static int virtio_pci_get_hfeatures(VDev *vdev, uint64_t *features) +{ + uint64_t feat0, feat1; + uint32_t selector; + int rc; + + selector =3D bswap32(0); + rc =3D pci_write(vdev->pci_fh, VPCI_C_OFFSET_DFSELECT, selector, 4); + rc |=3D pci_read(vdev->pci_fh, VPCI_C_OFFSET_DF, 4, &feat0, 4); + feat0 =3D bswap32(feat0); + + selector =3D bswap32(1); + rc |=3D pci_write(vdev->pci_fh, VPCI_C_OFFSET_DFSELECT, selector, 4); + rc |=3D pci_read(vdev->pci_fh, VPCI_C_OFFSET_DF, 4, &feat1, 4); + feat1 =3D bswap32(feat1); + + *features =3D feat1 << 32; + *features |=3D feat0; + + return rc; +} + +static int virtio_pci_set_gfeatures(VDev *vdev) +{ + uint64_t feats; + uint32_t selector; + int rc; + + selector =3D bswap32(0); + rc =3D pci_write(vdev->pci_fh, VPCI_C_OFFSET_GFSELECT, selector, 4); + + feats =3D bswap32((uint64_t)vdev->guest_features[1]); + rc |=3D pci_write(vdev->pci_fh, VPCI_C_OFFSET_GF, feats, 4); + + selector =3D bswap32(1); + rc |=3D pci_write(vdev->pci_fh, VPCI_C_OFFSET_GFSELECT, selector, 4); + + feats =3D bswap32((uint64_t)vdev->guest_features[0]); + rc |=3D pci_write(vdev->pci_fh, VPCI_C_OFFSET_GF, feats, 4); + + return rc; +} + +static int virtio_pci_get_blk_config(VDev *vdev) +{ + return pci_read(vdev->pci_fh, device_offset, 4, (uint64_t *)&vdev->con= fig.blk, + sizeof(VirtioBlkConfig)); + +} + +int virtio_pci_set_selected_vq(VDev *vdev, uint16_t queue_num) +{ + uint16_t le_queue_num; + + le_queue_num =3D bswap16(queue_num); + return pci_write(vdev->pci_fh, VPCI_C_OFFSET_Q_SELECT, (uint64_t)le_qu= eue_num, 2); +} + +int virtio_pci_set_queue_size(VDev *vdev, uint16_t queue_size) +{ + uint16_t le_queue_size; + + le_queue_size =3D bswap16(queue_size); + return pci_write(vdev->pci_fh, VPCI_C_OFFSET_Q_SIZE, (uint64_t)le_queu= e_size, 2); +} + +static int virtio_pci_set_queue_enable(VDev *vdev, uint16_t enabled) +{ + uint16_t le_enabled; + + le_enabled =3D bswap16(enabled); + return pci_write(vdev->pci_fh, VPCI_C_OFFSET_Q_ENABLE, (uint64_t)le_en= abled, 2); +} + +static int set_pci_vq_addr(VDev *vdev, void* addr, uint64_t config_offset_= lo) +{ + uint32_t le_lo, le_hi; + uint32_t tmp; + int rc; + + tmp =3D (uint32_t)(((uint64_t)addr) >> 32); + le_hi =3D bswap32(tmp); + + tmp =3D (uint32_t)((uint64_t)addr & 0xFFFFFFFF); + le_lo =3D bswap32(tmp); + + rc =3D pci_write(vdev->pci_fh, config_offset_lo, (uint64_t)le_lo, 4); + rc |=3D pci_write(vdev->pci_fh, config_offset_lo + 4, (uint64_t)le_hi= , 4); + + return rc; +} + +/* virtio spec v1.1 para 4.1.2.1 */ +void virtio_pci_id2type(VDev *vdev, uint16_t device_id) +{ + switch(device_id) { + case 0x1001: + vdev->type =3D VIRTIO_ID_BLOCK; + break; + case 0x1000: /* Other valid but currently unsupported virtio device ty= pes */ + case 0x1004: + default: + vdev->type =3D 0; + } +} + +/* + * Read PCI configuration space to find the offset of the Common, Device, = and + * Notification memory regions within the modern memory space. + * Returns 0 if success, 1 if a capability could not be located, or a + * negative RC if the configuration read failed. + */ +static int virtio_pci_read_pci_cap_config(VDev *vdev) +{ + uint8_t pos; + uint64_t data; + + /* Common cabilities */ + pos =3D find_cap_pos(vdev->pci_fh, VIRTIO_PCI_CAP_COMMON_CFG); + if (!pos) { + puts("Failed to locate PCI common configuration"); + return 1; + } + if (pci_read(vdev->pci_fh, pos + VIRTIO_PCI_CAP_OFFSET, 15, &data, 4))= { + return -EIO; + } + common_offset =3D bswap32(data); + + /* Device cabilities */ + pos =3D find_cap_pos(vdev->pci_fh, VIRTIO_PCI_CAP_DEVICE_CFG); + if (!pos) { + puts("Failed to locate PCI device configuration"); + return 1; + } + if (pci_read(vdev->pci_fh, pos + VIRTIO_PCI_CAP_OFFSET, 15, &data, 4))= { + return -EIO; + } + device_offset =3D bswap32(data); + + /* Notification cabilities */ + pos =3D find_cap_pos(vdev->pci_fh, VIRTIO_PCI_CAP_NOTIFY_CFG); + if (!pos) { + puts("Failed to locate PCI notification configuration"); + return 1; + } + if (pci_read(vdev->pci_fh, pos + VIRTIO_PCI_CAP_OFFSET, 15, &data, 4))= { + return -EIO; + } + notify_offset =3D bswap32(data); + + if (pci_read(vdev->pci_fh, pos + VIRTIO_PCI_NOTIFY_CAP_MULT, 15, &data= , 4)) { + return -EIO; + } + notify_mult =3D bswap32(data); + + if (pci_read(vdev->pci_fh, device_offset + VPCI_C_OFFSET_Q_NOFF, 4, &d= ata, 2)) { + return -EIO; + } + q_notify_offset =3D bswap16(data); + + return 0; +} + +int virtio_pci_reset(VDev *vdev) +{ + int rc; + uint8_t status =3D VPCI_S_RESET; + + rc =3D virtio_pci_set_status(vdev, status); + rc |=3D virtio_pci_get_status(vdev, &status); + + if (rc || status) { + puts("Failed to reset virtio-pci device"); + return 1; + } + + return 0; +} + +int virtio_pci_setup(VDev *vdev) +{ + VRing *vr; + int rc; + uint64_t pci_features, data; + uint8_t status; + int i =3D 0; + + vdev->config.blk.blk_size =3D 0; + vdev->guessed_disk_nature =3D VIRTIO_GDN_NONE; + vdev->cmd_vr_idx =3D 0; + + if (virtio_reset(vdev)) { + return -EIO; + } + + status =3D VPCI_S_ACKNOWLEDGE; + rc =3D virtio_pci_set_status(vdev, status); + if (rc) { + puts("Virtio-pci device Failed to ACKNOWLEDGE"); + return -EIO; + } + + virtio_pci_read_pci_cap_config(vdev); + if (rc) { + printf("Invalid PCI capabilities"); + return -EIO; + } + + switch (vdev->type) { + case VIRTIO_ID_BLOCK: + vdev->nr_vqs =3D 1; + vdev->cmd_vr_idx =3D 0; + virtio_pci_get_blk_config(vdev); + break; + default: + puts("Unsupported virtio device"); + return -ENODEV; + } + + status |=3D VPCI_S_DRIVER; + rc =3D virtio_pci_set_status(vdev, status); + if (rc) { + puts("Set status failed"); + return -EIO; + } + + /* Feature negotiation */ + rc =3D virtio_pci_get_hfeatures(vdev, &pci_features); + if (rc) { + puts("Failed to get feature bits"); + return -EIO; + } + + rc =3D virtio_pci_set_gfeatures(vdev); + if (rc) { + puts("Failed to set feature bits"); + return -EIO; + } + + /* Configure virt-queues for pci */ + for (i =3D 0; i < vdev->nr_vqs; i++) { + VqInfo info =3D { + .queue =3D (unsigned long long) virtio_get_ring_area() + (i * = VIRTIO_RING_SIZE), + .align =3D KVM_S390_VIRTIO_RING_ALIGN, + .index =3D i, + .num =3D 0, + }; + + vr =3D &vdev->vrings[i]; + rc =3D pci_read(vdev->pci_fh, VPCI_C_COMMON_NUMQ, 4, &data, 2); + if (rc) { + return rc; + } + + info.num =3D data; + vring_init(vr, &info); + + rc =3D virtio_pci_set_selected_vq(vdev, vr->id); + if (rc) { + puts("Failed to set selected virt-queue"); + return -EIO; + } + + rc =3D virtio_pci_set_queue_size(vdev, 16); + if (rc) { + puts("Failed to set virt-queue size"); + return -EIO; + } + + rc =3D set_pci_vq_addr(vdev, vr->desc, VPCI_C_OFFSET_Q_DESCLO); + rc |=3D set_pci_vq_addr(vdev, vr->avail, VPCI_C_OFFSET_Q_AVAILLO); + rc |=3D set_pci_vq_addr(vdev, vr->used, VPCI_C_OFFSET_Q_USEDLO); + if (rc) { + puts("Failed to set virt-queue address"); + return -EIO; + } + + rc =3D virtio_pci_set_queue_enable(vdev, true); + if (rc) { + puts("Failed to set virt-queue enabled"); + return -EIO; + } + } + + status |=3D VPCI_S_FEATURES_OK | VPCI_S_DRIVER_OK; + return virtio_pci_set_status(vdev, status); +} + +int virtio_pci_setup_device(void) +{ + int rc; + VDev *vdev =3D virtio_get_device(); + + rc =3D enable_pci_function(&vdev->pci_fh); + if (rc) { + puts("Failed to enable PCI function"); + return rc; + } + + return 0; +} + +long virtio_pci_notify(uint32_t fhandle, int vq_id) +{ + uint64_t notice =3D 1; + uint32_t offset =3D notify_offset + vq_id * q_notify_offset; + + return pci_write(fhandle, offset, notice, 4); +} diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 05cfca4dad..dba30335b7 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -14,6 +14,7 @@ #include "virtio.h" #include "virtio-scsi.h" #include "virtio-ccw.h" +#include "virtio-pci.h" #include "bswap.h" #include "helper.h" #include "s390-time.h" @@ -97,6 +98,8 @@ bool vring_notify(VRing *vr) case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: vr->cookie =3D virtio_ccw_notify(vr->schid, vr->id, vr->cookie); + case S390_IPL_TYPE_PCI: + vr->cookie =3D virtio_pci_notify(virtio_get_device()->pci_fh, vr->= id); } =20 return vr->cookie >=3D 0; @@ -181,6 +184,8 @@ int virtio_reset(VDev *vdev) case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: return virtio_ccw_reset(vdev); + case S390_IPL_TYPE_PCI: + return virtio_pci_reset(vdev); } =20 return -1; diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 1f17f98fc1..589962b998 100644 --- a/pc-bios/s390-ccw/Makefile +++ b/pc-bios/s390-ccw/Makefile @@ -35,7 +35,7 @@ QEMU_DGFLAGS =3D -MMD -MP -MT $@ -MF $(@D)/$(*F).d =20 OBJECTS =3D start.o main.o bootmap.o jump2ipl.o sclp.o menu.o netmain.o \ virtio.o virtio-net.o virtio-scsi.o virtio-blkdev.o cio.o dasd-ipl.o= \ - virtio-ccw.o clp.o pci.o + virtio-ccw.o clp.o pci.o virtio-pci.o =20 SLOF_DIR :=3D $(SRC_PATH)/../../roms/SLOF =20 --=20 2.49.0 From nobody Fri Nov 14 16:55:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1760977297; cv=none; d=zohomail.com; s=zohoarc; b=J6dXRYPTllSrCEsq2uZ5dAw5LXfhTFgOviH0D1hPsh7+EKCCf+k/HyC4KUX85e/HYGI0g/gsoM1Ar8UAuiQsOAWrYPvabjSW4yHFMty58luFn60pbEsXHHAfC2zpwu3NTXQL4kzUNJHA9EGFEG3HSxFW2rsMjzd7J6CnPdyaq70= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760977297; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=iOLemRhpy9jygC6HQBQlpKiDPxmooQPNig/YMzs6GHU=; b=mdVAqcrtDk6TeYRg67yUXZdj4Udv6Ot81aZPmZ6fWfaYcf2aRUCwDaNrC7kgeHH9Wp+sG0WXI2PMcMVNJrOXY55eOX23B/aSaVfEoGGdpEaz7qhu5DhHo78d5q+erkjo6o8upEgZs/rjO6IjdXnmO7weuywAvEO6IhNgKhkq0Wo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1760977297740879.7528733790122; Mon, 20 Oct 2025 09:21:37 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAscw-0003p5-La; Mon, 20 Oct 2025 12:20:54 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAsck-0003jY-94; Mon, 20 Oct 2025 12:20:42 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAsci-0000tB-10; Mon, 20 Oct 2025 12:20:42 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59K7Jg8o025774; Mon, 20 Oct 2025 16:20:38 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v32h9b95-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:38 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59KEJJk0017066; Mon, 20 Oct 2025 16:20:38 GMT Received: from smtprelay04.dal12v.mail.ibm.com ([172.16.1.6]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49vnkxpmwr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:38 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay04.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59KGKaDr42140068 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Oct 2025 16:20:36 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A223058065; Mon, 20 Oct 2025 16:20:36 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0B1B958052; Mon, 20 Oct 2025 16:20:36 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.78.141]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Oct 2025 16:20:35 +0000 (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=iOLemRhpy9jygC6HQ BQlpKiDPxmooQPNig/YMzs6GHU=; b=l7ZHpSk3SLg8CYgR3KWvI7AgagE+MJspX YCWy+uv15D4UHplmfTzpCiA1X3Ft09PF4wIAw/KaSV6JIwJJUCQUDFMDo7/igbPN hGG1plNU7l9sHHOZ2EhtYJQFah3rQGEt7Oyy+2V0fTs9EIh9XUfvA5OILwykHcaW GwUOBNRFDkwI3xeSz5OMWE4HUNcOu+kBYfCO7ocQHcyr5uzonC257x5VRZ9D8kwh SHDIQY210px9/CCIPRnDwJA4NTn5slXN+HZzbCpgWQkSdKJCF7tf3pgG0PXTDXEk nwikMUmXj6nTW1kS3VVNcSxfoii6ppnNz9ADGjnLQR3Bo29wsRKQw== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com Cc: jjherne@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, mjrosato@linux.ibm.com, jrossi@linux.ibm.com, zycai@linux.ibm.com Subject: [PATCH 6/7] s390x: Build IPLB for virtio-pci devices Date: Mon, 20 Oct 2025 12:20:22 -0400 Message-ID: <20251020162023.3649165-7-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251020162023.3649165-1-jrossi@linux.ibm.com> References: <20251020162023.3649165-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX+b/QEdKw9IED W1oB+IgeDpgLBWMTatuqMa15WuicReRqWBbwHOw8ArZxV534NaseSpkBHEQFRNXZUQyQ0sDxVFl W7cHdJDPXORcMA3c/ytGykhlpB6hy5W7Ch/Oh7kg7IJZtR4U243AMD6VJfXxOQrZ1sJGzuC8GF+ y5Zc/9VvTe35syAwTIHcqItYTcBC8vdEbmZM6CyXVL+Lz8vHkHsYL4KEkunRMwvIS+johVTTgR5 gMy75UrOVTFmVwHZlz6SuEGgl2HEpo3PaiVZ7ZiERHYG+rtdqZwoatk9ocHbmhP+eJ8tkVDJxyr U8gxSDmcM4u0NTHEkyM31rL9lUF7YsGThwgEeSzFBrO1MzMBWD8FEzqSH1F8mspfNG0Il7uD55r gKFxT9F/l/WDlmpONs+ICI7g0/xubg== X-Authority-Analysis: v=2.4 cv=OrVCCi/t c=1 sm=1 tr=0 ts=68f66156 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=kXybejxr6HjCZ4bXjZsA:9 X-Proofpoint-GUID: TEKaNRAEaIY0r_hxP-iGLEmb5dHEXsy0 X-Proofpoint-ORIG-GUID: TEKaNRAEaIY0r_hxP-iGLEmb5dHEXsy0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-20_04,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 adultscore=0 priorityscore=1501 spamscore=0 phishscore=0 clxscore=1015 bulkscore=0 malwarescore=0 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=148.163.158.5; envelope-from=jrossi@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1760977299144154101 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Search for a corresponding S390PCIBusDevice and build an IPLB if a device h= as been indexed for boot but does not identify as a CCW device, PCI devices are not yet included in boot probing (they must have a boot ind= ex). Per-device loadparm is not yet supported for PCI devices. Signed-off-by: Jared Rossi --- hw/s390x/ipl.h | 3 ++ include/hw/s390x/s390-pci-bus.h | 2 ++ hw/s390x/ipl.c | 56 ++++++++++++++++++++++++++++++--- hw/s390x/s390-pci-bus.c | 2 +- 4 files changed, 57 insertions(+), 6 deletions(-) diff --git a/hw/s390x/ipl.h b/hw/s390x/ipl.h index aec2244321..5396d4ed91 100644 --- a/hw/s390x/ipl.h +++ b/hw/s390x/ipl.h @@ -107,6 +107,7 @@ QEMU_BUILD_BUG_MSG(offsetof(S390IPLState, iplb) & 3, "a= lignment of iplb wrong"); #define S390_IPLB_MIN_PV_LEN 148 #define S390_IPLB_MIN_CCW_LEN 200 #define S390_IPLB_MIN_FCP_LEN 384 +#define S390_IPLB_MIN_PCI_LEN 376 #define S390_IPLB_MIN_QEMU_SCSI_LEN 200 =20 static inline bool iplb_valid_len(IplParameterBlock *iplb) @@ -179,6 +180,8 @@ static inline bool iplb_valid(IplParameterBlock *iplb) return len >=3D S390_IPLB_MIN_FCP_LEN; case S390_IPL_TYPE_CCW: return len >=3D S390_IPLB_MIN_CCW_LEN; + case S390_IPL_TYPE_PCI: + return len >=3D S390_IPLB_MIN_PCI_LEN; case S390_IPL_TYPE_QEMU_SCSI: default: return false; diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bu= s.h index 04944d4fed..18c6a6d6d5 100644 --- a/include/hw/s390x/s390-pci-bus.h +++ b/include/hw/s390x/s390-pci-bus.h @@ -402,6 +402,8 @@ S390PCIBusDevice *s390_pci_find_dev_by_fh(S390pciState = *s, uint32_t fh); S390PCIBusDevice *s390_pci_find_dev_by_fid(S390pciState *s, uint32_t fid); S390PCIBusDevice *s390_pci_find_dev_by_target(S390pciState *s, const char *target); +S390PCIBusDevice *s390_pci_find_dev_by_pci(S390pciState *s, + PCIDevice *pci_dev); S390PCIBusDevice *s390_pci_find_next_avail_dev(S390pciState *s, S390PCIBusDevice *pbdev); void s390_pci_ism_reset(void); diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index 2f082396c7..4d0ff25816 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -22,12 +22,14 @@ #include "hw/loader.h" #include "hw/qdev-properties.h" #include "hw/boards.h" +#include "hw/s390x/s390-pci-bus.h" #include "hw/s390x/virtio-ccw.h" #include "hw/s390x/vfio-ccw.h" #include "hw/s390x/css.h" #include "hw/s390x/ebcdic.h" #include "hw/scsi/scsi.h" #include "hw/virtio/virtio-net.h" +#include "hw/virtio/virtio-pci.h" #include "ipl.h" #include "qemu/error-report.h" #include "qemu/config-file.h" @@ -337,7 +339,8 @@ static void s390_ipl_set_boot_menu(S390IPLState *ipl) ipl->qipl.boot_menu_timeout =3D cpu_to_be32(splash_time); } =20 -#define CCW_DEVTYPE_NONE 0x00 +#define S390_DEVTYPE_NONE 0x00 + #define CCW_DEVTYPE_VIRTIO 0x01 #define CCW_DEVTYPE_VIRTIO_NET 0x02 #define CCW_DEVTYPE_SCSI 0x03 @@ -346,7 +349,7 @@ static void s390_ipl_set_boot_menu(S390IPLState *ipl) static CcwDevice *s390_get_ccw_device(DeviceState *dev_st, int *devtype) { CcwDevice *ccw_dev =3D NULL; - int tmp_dt =3D CCW_DEVTYPE_NONE; + int tmp_dt =3D S390_DEVTYPE_NONE; =20 if (dev_st) { VirtIONet *virtio_net_dev =3D (VirtIONet *) @@ -393,6 +396,31 @@ static CcwDevice *s390_get_ccw_device(DeviceState *dev= _st, int *devtype) return ccw_dev; } =20 +#define PCI_DEVTYPE_VIRTIO 0x05 + +static S390PCIBusDevice *s390_get_pci_device(DeviceState *dev_st, int *dev= type) +{ + S390PCIBusDevice *pbdev =3D NULL; + int tmp_dt =3D S390_DEVTYPE_NONE; + + if (dev_st) { + PCIDevice *pci_dev =3D (PCIDevice *) + object_dynamic_cast(OBJECT(qdev_get_parent_bus(dev_st)->parent= ), + TYPE_PCI_DEVICE= ); + if (pci_dev) { + pbdev =3D s390_pci_find_dev_by_pci(s390_get_phb(), pci_dev); + if (pbdev) { + tmp_dt =3D PCI_DEVTYPE_VIRTIO; + } + } + } + if (devtype) { + *devtype =3D tmp_dt; + } + + return pbdev; +} + static uint64_t s390_ipl_map_iplb_chain(IplParameterBlock *iplb_chain) { S390IPLState *ipl =3D get_ipl_device(); @@ -425,14 +453,12 @@ void s390_ipl_convert_loadparm(char *ascii_lp, uint8_= t *ebcdic_lp) static bool s390_build_iplb(DeviceState *dev_st, IplParameterBlock *iplb) { CcwDevice *ccw_dev =3D NULL; + S390PCIBusDevice *pbdev =3D NULL; SCSIDevice *sd; int devtype; uint8_t *lp; g_autofree void *scsi_lp =3D NULL; =20 - /* - * Currently allow IPL only from CCW devices. - */ ccw_dev =3D s390_get_ccw_device(dev_st, &devtype); if (ccw_dev) { lp =3D ccw_dev->loadparm; @@ -482,6 +508,26 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPa= rameterBlock *iplb) return true; } =20 + pbdev =3D s390_get_pci_device(dev_st, &devtype); + if (pbdev) { + switch (devtype) { + case PCI_DEVTYPE_VIRTIO: + iplb->len =3D S390_IPLB_MIN_PCI_LEN; + iplb->pbt =3D S390_IPL_TYPE_PCI; + iplb->pci.fid =3D pbdev->fid; + break; + default: + return false; + } + + /* Per-device loadparm not yet supported for non-ccw IPL */ + lp =3D S390_CCW_MACHINE(qdev_get_machine())->loadparm; + s390_ipl_convert_loadparm((char *)lp, iplb->loadparm); + iplb->flags |=3D DIAG308_FLAGS_LP_VALID; + + return true; + } + return false; } =20 diff --git a/hw/s390x/s390-pci-bus.c b/hw/s390x/s390-pci-bus.c index 52820894fa..615974851b 100644 --- a/hw/s390x/s390-pci-bus.c +++ b/hw/s390x/s390-pci-bus.c @@ -249,7 +249,7 @@ S390PCIBusDevice *s390_pci_find_dev_by_target(S390pciSt= ate *s, return NULL; } =20 -static S390PCIBusDevice *s390_pci_find_dev_by_pci(S390pciState *s, +S390PCIBusDevice *s390_pci_find_dev_by_pci(S390pciState *s, PCIDevice *pci_dev) { S390PCIBusDevice *pbdev; --=20 2.49.0 From nobody Fri Nov 14 16:55:24 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1760977285; cv=none; d=zohomail.com; s=zohoarc; b=lWTApq+5wllhppadSlLRl0URJDE0++suMhqC7YLUhF+9GiKhAAfv69vzZ4io4BUZBxMj2VSZnEnPRrjmo7a6BAsqKi4AP7qy+ctkD90SnYomXksSIVbB4kpPs+DHPnvmTqgd7/kdIYriydmjS+lGyGK7H1LutzNRSfewQiZ5iSA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760977285; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=NAyieAw2SufomrfZFUwB2+pmnqmdJ+XxYzKZ+g9/cLk=; b=LJ0PFFw+LQ/eGUd8A1E9Hy13+QW6mB40OP3tHnUj3dFli15gKGVLhj055OCJKQA/BRzSd4jDMmuiZWs0lJB6xeuemlxNmTZobEnlIc6DKeAbJ00KGv5gwmQVG7SmfZ7KmQlEpaljQnDNZsoD3KY6lsbWgCbAago0oPnc3ehafbM= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17609772852271000.687110558379; Mon, 20 Oct 2025 09:21:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vAscx-0003pb-U7; Mon, 20 Oct 2025 12:20:55 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAscl-0003k8-S3; Mon, 20 Oct 2025 12:20:44 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vAscj-0000tX-UY; Mon, 20 Oct 2025 12:20:43 -0400 Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59KCkPwx030017; Mon, 20 Oct 2025 16:20:40 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v31rtg4w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:39 +0000 (GMT) Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59KFAbKL002926; Mon, 20 Oct 2025 16:20:39 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vqej6brt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 20 Oct 2025 16:20:39 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay03.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59KGKcIV31064736 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Mon, 20 Oct 2025 16:20:38 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2A1D758067; Mon, 20 Oct 2025 16:20:38 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7248958065; Mon, 20 Oct 2025 16:20:37 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.78.141]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Mon, 20 Oct 2025 16:20:37 +0000 (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=NAyieAw2SufomrfZF UwB2+pmnqmdJ+XxYzKZ+g9/cLk=; b=QzpphJTVt6efYu/bC1Uk/Flacz4kre+oi wjsPBb6WvNBUYMlfmkK0qfkhOxRe5FVR0GQlqMDhtj+eqEjHm1hpMA02GDhH3DMS Fde3vscowvOMEmn96sADPqEhuo55HdpVn0jPsTNXmrX32xkiDSdPQgzCmuxwpCm6 tbB7YWGyS6ymAWbuT/kb08Q9G8irSkTPltI8dn6UKvpptkNdBcPiPzmvfbRcVsVT 2jiBUNfcJGP9kmhG1gjMU3m9s/mCPR27DAF4MT1d6ihIeI1pLP86ZT54j4kif7Zm yIRdR03ODQMkDIxOsP+ukyhWSP8jchvp/z71ptVW/SJ2bLA+jlhHg== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com Cc: jjherne@linux.ibm.com, alifm@linux.ibm.com, farman@linux.ibm.com, mjrosato@linux.ibm.com, jrossi@linux.ibm.com, zycai@linux.ibm.com Subject: [PATCH 7/7] tests/qtest: Add s390x PCI boot test to cdrom-test.c Date: Mon, 20 Oct 2025 12:20:23 -0400 Message-ID: <20251020162023.3649165-8-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251020162023.3649165-1-jrossi@linux.ibm.com> References: <20251020162023.3649165-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: HwU4zMJLiw7IuG5MtiZ7AQ7NIEP9e4YS X-Proofpoint-GUID: HwU4zMJLiw7IuG5MtiZ7AQ7NIEP9e4YS X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfXxM9Ose+l/0ed ub/ZUu9xiaMiLcXsaBAStlhiA4PNoLxFp86tnPrb1zbqmQzlQaPhAFd8mztO/NDe+YW5UUrchxy N4WE5lXT4KRT4wsOpuOHKDeLVBjmsYP26hcuMyASScj+SpxNun0z4dBY01NRP6fyDJwFl29Ei3A Rana9KX/2yug+KVzx9PmjjRjCiKMVJTuSgGYa9BeWJH+Os/u7AiYVX3XPZC/RKdV+068k+yC4IY LEmo8WSH35NhSbizkqxRm5rr1GqmqR7DMikMzb7G9Ryndvjg44QzxsR8RihCd5dEOrdsAfdWSIp edWVQer+AQZF/qT+/S8DY4LNTZoYBk9EMPD/eKOCKId6EJQ7/M9Z/Is71h/Ms9s/NVpDNZ6Pdzf cw2VTOacnXCbpIPWC3eSn3D2jFF/JA== X-Authority-Analysis: v=2.4 cv=IJYPywvG c=1 sm=1 tr=0 ts=68f66158 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=nJdWAAiftWQBe2TG7ssA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-20_04,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 lowpriorityscore=0 clxscore=1015 suspectscore=0 spamscore=0 bulkscore=0 adultscore=0 impostorscore=0 malwarescore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=148.163.156.1; envelope-from=jrossi@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @ibm.com) X-ZM-MESSAGEID: 1760977291573158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Add a rudimentary test for s390x IPL to verify that a guest may boot using virtio-blk-pci device. Signed-off-by: Jared Rossi Reviewed-by: Thomas Huth --- tests/qtest/cdrom-test.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/qtest/cdrom-test.c b/tests/qtest/cdrom-test.c index 56e2d283a9..a65854d2bc 100644 --- a/tests/qtest/cdrom-test.c +++ b/tests/qtest/cdrom-test.c @@ -246,6 +246,13 @@ static void add_s390x_tests(void) "-drive if=3Dnone,id=3Dd2,media=3Dcdrom,file= =3D", test_cdboot); } + if (qtest_has_device("virtio-blk-pci")) { + qtest_add_data_func("cdrom/boot/pci-bus-with-bootindex", + "-device virtio-scsi -device virtio-serial " + "-device virtio-blk-pci,drive=3Dd1,bootindex= =3D1 " + "-drive if=3Dnone,id=3Dd1,media=3Dcdrom,file= =3D", + test_cdboot); + } } =20 int main(int argc, char **argv) --=20 2.49.0