From nobody Sun Feb 8 19:28:05 2026 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=1765400141; cv=none; d=zohomail.com; s=zohoarc; b=Uq1LW11bl/yhwOMO4Juunpydj88bwnBZ137qLd4fpq6AV6OAaw4twN4F1veqxHQlBg+q/CoRHkhq+TFznRG6mYxz6hIMPYk+f9LBdnmEI588iCL3TPO9Gr+EIWOXp1aYNZ7RibNk99lpitEqsUiM/QPiWLsUpeQTvteL5Tjv8nY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400141; 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=KY5zirasJ9FY74vVSTTQ8U8kxNmnH9//OqaxEQVe7PY=; b=JMGTMuNsAVFF0iyPISzlUGj8cN0d0uOMWIV+/M+NazuGGZ/4ngB3GppPfrGvDfjCTavdxPi1MwQ1+sRf3oZ0v37RkyZOzi+jrAjzycFdFcKrFEaxySyDxzWBirGnHeKg1XW1iAWDyekqN3xDeA+bnuCP1RkG6Rvp4/XMdf0NKMg= 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 1765400141072854.5181246277112; Wed, 10 Dec 2025 12:55:41 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDB-0004X6-2u; Wed, 10 Dec 2025 15:55:01 -0500 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 1vTRD9-0004Vm-Eq; Wed, 10 Dec 2025 15:54:59 -0500 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 1vTRD7-0000Um-JA; Wed, 10 Dec 2025 15:54:58 -0500 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 5BAIIRgb014598; Wed, 10 Dec 2025 20:54:56 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 4avc53kvs0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:54:55 +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 5BAJnqf0028102; Wed, 10 Dec 2025 20:54:55 GMT Received: from smtprelay07.dal12v.mail.ibm.com ([172.16.1.9]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4avy6y2wkc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:54:55 +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 5BAKssDB16384622 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:54:54 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E98AC58056; Wed, 10 Dec 2025 20:54:53 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 44EAA58052; Wed, 10 Dec 2025 20:54:53 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:54:53 +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=KY5zirasJ9FY74vVS TTQ8U8kxNmnH9//OqaxEQVe7PY=; b=pNGutfvbtor/NfNxYQ72ZYmfsMsPk/QsF iPreRDpWVYea4BqCMCSARLP70GwBgrV7XNVH9DLUIZPfOZ+YjZTxTvZaRllXlSLV LWcF1iNqR4TNXh36bQktePigH6Et5zS1oIDU4AdFi5ErCTtd4JTx8vBi3QA3GQ7o LaA3BYMs/+jZE2XZSKLRGbKAvzUSOnjImDwm7NaJPI8xP+vy9+PpkVCLbGW1ZyJ5 q+0GTsZgqH2VWdKXYNWR7TMzLw7hSKQ464MoqFsE4A/jmwz83Siu8VKD2SiFokDh oQHrgSSnrPxMDmGuii44m6EFJAkY7NTdzkpgiBbEqlVFcaYtH7oJQ== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 01/10] pc-bios/s390-ccw: Fix misattributed function prototypes Date: Wed, 10 Dec 2025 15:54:40 -0500 Message-ID: <20251210205449.2783111-2-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAyMCBTYWx0ZWRfXxs4sAdwIZlrs v8DbUUXL5T2//2KPrf0mUNnkrZfqqNQ2i+f7YUB6u6M/dI6ONB+0UlhoRJm/50oxC9ugiPUlPc9 kZNBzl9nmCT6gQoBu2n71FHSDm85Ln5/2DgPr9bhOOC2KXWyMldl60cvv7UvqRYKLaRKtBF7Gcs pdVUlEfdPVLjaXZEdQ4+gjarmarckGYFllU+03Q8eejfwaoJhanzFu7G40536lwzCg+MCeDCXZD U00izo9TLYxOWrj+LB3Gu3ntYIQHU7AK/kPzqHsFRnCevjo54PwuPYXtSst03/gmPW+Zg/hLXZ5 ZNpw63WykfGoY+uDVGYN5Mk8g7b/KCbgVuv5ytTXsfyLmjl+iCg9ttf04LrZTKRMUdaLyon2kmC JYl1bKzzONgv3MmWRJnyeycRn3L0SA== X-Authority-Analysis: v=2.4 cv=S/DUAYsP c=1 sm=1 tr=0 ts=6939de1f cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA:8 a=HoESQQHAtyuLEXRXYhEA:9 X-Proofpoint-ORIG-GUID: nwtJhOkF31sOVDz3dbzLZiq2NsuDjFHN X-Proofpoint-GUID: nwtJhOkF31sOVDz3dbzLZiq2NsuDjFHN X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 impostorscore=0 suspectscore=0 lowpriorityscore=0 adultscore=0 spamscore=0 bulkscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060020 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: 1765400142058158500 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. Reviewed-by: Thomas Huth Signed-off-by: Jared Rossi Reviewed-by: Eric Farman --- 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 Sun Feb 8 19:28:05 2026 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=1765400145; cv=none; d=zohomail.com; s=zohoarc; b=h4Aa5K2SF8f53VG1wsLQMkjo6sxiRH9BBdctjjZqH5PEswajER61AzF2qV8Wnumv6WVr3qsME4ygOKDwdmiEgXC+DNcugE7d3fcReUf6gt8sGwpTPAjHShN39zSw1KrmG4QXgu/lRyKR9UP1OkwpwH9KGGLGaER0f7LIHZdpuSA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400145; 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=T221tsU4rQbXHOLBfXaiRSMtN2hHB1kztNXbbmpvbqw=; b=KJoB5qXrWp6iIpR3dARJ7v7aZ76kDae3NWmIytLlJVb6cAzdNWcEVUigr0aIv2JP16Z//PeUWzW98vqMA8fYleOxqeWzbXE8rJ0B6Xn24iaSV/Zalr30MMNLBl07GeJaCSExPyJlwV1JgolcmcDvDYO4kexuYkmZOKDbYh6JkI4= 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 1765400145542607.4696434869362; Wed, 10 Dec 2025 12:55:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDE-0004Zd-RI; Wed, 10 Dec 2025 15:55:04 -0500 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 1vTRDC-0004YI-7d; Wed, 10 Dec 2025 15:55:02 -0500 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 1vTRD9-0000V4-UY; Wed, 10 Dec 2025 15:55:01 -0500 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5BAJG6Mm000771; Wed, 10 Dec 2025 20:54:58 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 4av9wvv3gu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:54:58 +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 5BAHUp41002057; Wed, 10 Dec 2025 20:54:57 GMT Received: from smtprelay01.wdc07v.mail.ibm.com ([172.16.1.68]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4aw11jjm9m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:54:57 +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 5BAKstXQ4129570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:54:56 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C388058056; Wed, 10 Dec 2025 20:54:55 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2060158052; Wed, 10 Dec 2025 20:54:55 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:54:55 +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=T221tsU4rQbXHOLBf XaiRSMtN2hHB1kztNXbbmpvbqw=; b=PxVJvoRNE1CHzCr02m04GtkW4vpGBiOch 5vvkWWFIGmiLVFWoIv9pTBHSr2N1znpWllMlsPLbgto3dIJkCXmAJzp6E2OahCeB x5iytD95KO5S6zdgLYsVDzrgiQrwRnAS0Lyq9whAColBzhSPCnbfefs+cGH/r5Wu buvuDYuHqFewJ4mjxD0O4vt+8xt05O4ismJyLHNwsnXWMGmNfDPdUj1Z9QqcRl1A RCBbr55AEla1fWEqQtdoXQDt6noW2GYZLFLVcyEQ3Y9+gSYMpaJu49BRj4GAyCc9 ifam2VqhABez5a65bvgCPz0xlqz5OL/uvS3m2jpniO2GPBgNhASPQ== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 02/10] pc-bios/s390-ccw: Store boot device type and bus separately Date: Wed, 10 Dec 2025 15:54:41 -0500 Message-ID: <20251210205449.2783111-3-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: YUJLOll6M551GVQx4Rattsjt3wzt6egP X-Proofpoint-ORIG-GUID: YUJLOll6M551GVQx4Rattsjt3wzt6egP X-Authority-Analysis: v=2.4 cv=AdS83nXG c=1 sm=1 tr=0 ts=6939de22 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=q3-f_CF3BKJy3EcvVqUA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAwMCBTYWx0ZWRfXw6QUhlwNJYgI pMV7MYcyrzEUyYfnEF994iYnBMOYSyky6wx5j+vO4r3N/yxAt1PHMi9wj/6fbcUPQgf71y+yHx6 /JIv/Wn1vnMfgrmiYn1CEbDjjeZj9tTC2ca2aRu+tF+/3FPp7vVXB3vNiNV9UsWrYxakoZHWT0B SqG0hgTIlbknzvlR9rrfz9+64marNAEndFLMEQSlk37Q7cKOdMA3fIAIH7T6+DpqrpzClFG2DvZ k/m6wPSNGcsVCVGvekdGikv6KaBnRoZl12WBTSJfI5NQfNUoPcQ6UCNV/+rMV36U3ym4im3X+O/ N69gKrZhTrB8KS3cFYP5/g5fs/LMt/g4A4RECF9iO59gQE22rcdkspspRnCyrg9LqFUoVD63CpR fba0e7wSxIiQf7aNrk/WODdWTSDeQQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 priorityscore=1501 spamscore=0 phishscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 malwarescore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060000 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: 1765400147743158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Store both the device type (e.g. block) and device bus (e.g. CCW) to determ= ine IPL format rather than assume all devices can be identified by CCW specific sense data. Signed-off-by: Jared Rossi Reviewed-by: Eric Farman --- hw/s390x/ipl.h | 5 ---- include/hw/s390x/ipl/qipl.h | 7 ++++++ pc-bios/s390-ccw/iplb.h | 4 ---- pc-bios/s390-ccw/virtio.h | 2 ++ pc-bios/s390-ccw/main.c | 10 +++++--- pc-bios/s390-ccw/virtio-blkdev.c | 39 +++++++++++++++++++------------- pc-bios/s390-ccw/virtio.c | 13 +++++++---- 7 files changed, 48 insertions(+), 32 deletions(-) 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..8199b839f0 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -20,6 +20,13 @@ #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_PV 0x05 +#define S390_IPL_TYPE_QEMU_SCSI 0xff + +#define QEMU_DEFAULT_IPL S390_IPL_TYPE_CCW + /* * 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.h b/pc-bios/s390-ccw/virtio.h index 597bd42358..d557a4a90e 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -239,6 +239,8 @@ struct VDev { VirtioGDN guessed_disk_nature; SubChannelId schid; SenseId senseid; + VirtioDevType dev_type; + int ipl_type; union { VirtioBlkConfig blk; VirtioScsiConfig scsi; diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c index 76bf743900..fef192c934 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -162,7 +162,7 @@ static void menu_setup(void) return; } =20 - switch (iplb.pbt) { + switch (virtio_get_device()->ipl_type) { case S390_IPL_TYPE_CCW: case S390_IPL_TYPE_QEMU_SCSI: menu_set_parms(qipl.qipl_flags & BOOT_MENU_FLAG_MASK, @@ -190,6 +190,7 @@ static void css_setup(void) static void boot_setup(void) { char lpmsg[] =3D "LOADPARM=3D[________]\n"; + VDev *vdev =3D virtio_get_device(); =20 if (have_iplb && memcmp(iplb.loadparm, NO_LOADPARM, LOADPARM_LEN) !=3D= 0) { ebcdic_to_ascii((char *) iplb.loadparm, loadparm_str, LOADPARM_LEN= ); @@ -198,7 +199,10 @@ static void boot_setup(void) } =20 if (have_iplb) { + vdev->ipl_type =3D iplb.pbt; menu_setup(); + } else { + vdev->ipl_type =3D QEMU_DEFAULT_IPL; } =20 memcpy(lpmsg + 10, loadparm_str, 8); @@ -216,7 +220,7 @@ static bool find_boot_device(void) VDev *vdev =3D virtio_get_device(); bool found =3D false; =20 - switch (iplb.pbt) { + switch (vdev->ipl_type) { case S390_IPL_TYPE_CCW: vdev->scsi_device_selected =3D false; debug_print_int("device no. ", iplb.ccw.devno); @@ -245,7 +249,7 @@ static int virtio_setup(void) vdev->is_cdrom =3D false; int ret; =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_NET: puts("Network boot device detected"); return 0; diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index 4b819dd80f..f40a9407c2 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -53,14 +53,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->dev_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 +119,7 @@ void virtio_assume_iso9660(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_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 +129,8 @@ void virtio_assume_iso9660(void) case VIRTIO_ID_SCSI: vdev->scsi_block_size =3D VIRTIO_ISO_BLOCK_SIZE; break; + default: + return; } } =20 @@ -139,13 +141,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->dev_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: + return; } vdev->config.blk.geometry.heads =3D 15; vdev->config.blk.geometry.sectors =3D @@ -162,50 +166,52 @@ 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) && - blksize >=3D 512 && blksize <=3D 4096; + return (vdev->dev_type =3D=3D VIRTIO_ID_BLOCK || vdev->dev_type =3D=3D= VIRTIO_ID_SCSI) + && blksize >=3D 512 && blksize <=3D 4096; } =20 int virtio_get_block_size(void) { VDev *vdev =3D virtio_get_device(); =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_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->dev_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->dev_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,13 +219,14 @@ 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->dev_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) diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index cd6c99c7e3..0f4f201038 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -41,7 +41,7 @@ VDev *virtio_get_device(void) =20 VirtioDevType virtio_get_device_type(void) { - return vdev.senseid.cu_model; + return vdev.dev_type; } =20 /* virtio spec v1.0 para 4.3.3.2 */ @@ -103,7 +103,7 @@ static int run_ccw(VDev *vdev, int cmd, void *ptr, int = len, bool sli) ccw.flags |=3D CCW_FLAG_SLI; } =20 - return do_cio(vdev->schid, vdev->senseid.cu_type, ptr2u32(&ccw), CCW_F= MT1); + return do_cio(vdev->schid, vdev->dev_type, ptr2u32(&ccw), CCW_FMT1); } =20 static void vring_init(VRing *vr, VqInfo *info) @@ -248,7 +248,7 @@ int virtio_setup_ccw(VDev *vdev) return -EIO; } =20 - switch (vdev->senseid.cu_model) { + switch (vdev->dev_type) { case VIRTIO_ID_NET: vdev->nr_vqs =3D 2; vdev->cmd_vr_idx =3D 0; @@ -347,12 +347,17 @@ bool virtio_is_supported(SubChannelId schid) true)) { return false; } + + vdev.dev_type =3D vdev.senseid.cu_model; + if (vdev.senseid.cu_type =3D=3D 0x3832) { - switch (vdev.senseid.cu_model) { + switch (vdev.dev_type) { case VIRTIO_ID_BLOCK: case VIRTIO_ID_SCSI: case VIRTIO_ID_NET: return true; + default: + return false; } } return false; --=20 2.49.0 From nobody Sun Feb 8 19:28:05 2026 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=1765400209; cv=none; d=zohomail.com; s=zohoarc; b=guDoUcKWljB0X5bucMYoJuVh3pB1r9iM+32xQJuV40eDGse/W0ttEexhnXQqg1YsoFqPu3qjojM4KtXwBTifMToI1DhhvaRznLbYnovz1GerRHrB8n8s0nYGMtQe6+S4AwhG7OGXQS+QhFuRaUGBANwnfW1xy7Ljj0OY0Em+7h4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400209; 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=xOn+t0AO6RnwrXqaeG3qxLqNpzOW5kMEQhcCSXGF/BQ=; b=HvSgRZv2gCpAVs0Jaj1NzxiIQFd+tzEfQ5rKJsTRnjD/gEDmmATo/yX21FXDuBb3PW+7R71JOKdQdoGBsEhT0vEodu/EC2/3ltBZutO0dFjTT2YZbftw7SX2/Ex1S6ubVNzgyI95eR4ndUljLpR8HZdlu5hs/Y+L4IH28KMB1qo= 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 1765400209605534.2177429421139; Wed, 10 Dec 2025 12:56:49 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDH-0004dj-Mw; Wed, 10 Dec 2025 15:55:07 -0500 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 1vTRDF-0004a3-4S; Wed, 10 Dec 2025 15:55:05 -0500 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 1vTRDC-0000VO-5D; Wed, 10 Dec 2025 15:55:04 -0500 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 5BAKlI7C019682; Wed, 10 Dec 2025 20:55:00 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 4avc0k4hx3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:54:59 +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 5BAKZ3pE002044; Wed, 10 Dec 2025 20:54:59 GMT Received: from smtprelay02.dal12v.mail.ibm.com ([172.16.1.4]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4aw11jjm9s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:54:58 +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 5BAKsvnk30409284 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:54:57 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B1DC65805D; Wed, 10 Dec 2025 20:54:57 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E85B658052; Wed, 10 Dec 2025 20:54:56 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:54:56 +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=xOn+t0AO6RnwrXqae G3qxLqNpzOW5kMEQhcCSXGF/BQ=; b=omDUMdlWrFKBEG+BvxiEyNmI5TLYXJ68j ir+aW3ZX49rgKt2HQegJIU/4nz4aWUvBfbjKV+GYj3oZI2bFQQOii8jdjRLcPno/ WPM/D8nNhzJHIUz0AAcb3gfircUV9GOME5H1YYZy0B/iPCUWejpCl+0QKVFyBPYJ WQSG0crO6PRvmnNMHx3rWMYo5/ZRsliEzc7SHAF5nAmr/CKmD7UHfAkuyex57ZpL 3F9uvGtb+1xd9gIItMVE3zaWzARFPpOttNKWsMuP4hKoWb0i2uhUiez/KOs87lcP COteVDH/QgvxWiyhLZMYFLR9oLpNWKwXlJwU9Llrc1F4cukv0tyow== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 03/10] pc-bios/s390-ccw: Split virtio-ccw and generic virtio Date: Wed, 10 Dec 2025 15:54:42 -0500 Message-ID: <20251210205449.2783111-4-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-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=Cf8FJbrl c=1 sm=1 tr=0 ts=6939de24 cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=ctsVLiZ_AAAA:8 a=PTsCt0Tlsz4LzM6cV-MA:9 a=3VCIHQLkQthbvTRuo98s:22 X-Proofpoint-ORIG-GUID: i3LqYVbhDylcTSF0BMfAW-3HUfzDU_aR X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAxNiBTYWx0ZWRfX+W4qFZ6k4aCN TybFKuXbCo2kRNsSyhVoY94pJ5bZCu2B5csX97/AJ/P766Imx/1ZFCjklEW3u31BWStR4It0VLJ ddtBWxVegkZIiJjM3Ec2BjxOEQFJIvB/5dWh/PTgLKGzoNMEn/ol9bL108dCdWygi71d7LWtJgh 5UmEQ68kxjsDNCvm8PcPtZoUePFdMoMyqIS0J9D4m0Xs0mNaad+9c5fO/THPUOImRkcb9car1wq S5lKQ0eYIQmlh4FnVqByj35IG2P/oDB782nc7TLQ2tzj2Z/JiIQeUNN3++yLnfnwAEwDuk/uNQT X62nL1ZH6arueETDOC7c6ZP5Q7eA9XjV5Ix16RG21mPWSPKQ7cXPbRAPkUNnJq7a7FxfQq3H22z svNvi9Fkj4KO38EtXhkE69I0qTj9mw== X-Proofpoint-GUID: i3LqYVbhDylcTSF0BMfAW-3HUfzDU_aR X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 bulkscore=0 malwarescore=0 clxscore=1015 adultscore=0 lowpriorityscore=0 impostorscore=0 priorityscore=1501 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060016 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: 1765400210012158500 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 --- pc-bios/s390-ccw/s390-ccw.h | 3 - pc-bios/s390-ccw/virtio-ccw.h | 24 +++ pc-bios/s390-ccw/virtio-scsi.h | 2 +- pc-bios/s390-ccw/virtio.h | 7 +- pc-bios/s390-ccw/main.c | 10 +- pc-bios/s390-ccw/netmain.c | 2 +- pc-bios/s390-ccw/virtio-blkdev.c | 15 +- pc-bios/s390-ccw/virtio-ccw.c | 242 +++++++++++++++++++++++++++++++ pc-bios/s390-ccw/virtio-net.c | 5 +- pc-bios/s390-ccw/virtio-scsi.c | 6 +- pc-bios/s390-ccw/virtio.c | 237 +++++------------------------- pc-bios/s390-ccw/Makefile | 3 +- 12 files changed, 334 insertions(+), 222 deletions(-) create mode 100644 pc-bios/s390-ccw/virtio-ccw.h create mode 100644 pc-bios/s390-ccw/virtio-ccw.c diff --git a/pc-bios/s390-ccw/s390-ccw.h b/pc-bios/s390-ccw/s390-ccw.h index 47ea66bd4d..ccd68ff0a4 100644 --- a/pc-bios/s390-ccw/s390-ccw.h +++ b/pc-bios/s390-ccw/s390-ccw.h @@ -66,9 +66,6 @@ void sclp_setup(void); void sclp_get_loadparm_ascii(char *loadparm); int sclp_read(char *str, size_t count); =20 -/* virtio.c */ -bool virtio_is_supported(SubChannelId schid); - /* bootmap.c */ void zipl_load(void); =20 diff --git a/pc-bios/s390-ccw/virtio-ccw.h b/pc-bios/s390-ccw/virtio-ccw.h new file mode 100644 index 0000000000..cdf6a55dc8 --- /dev/null +++ b/pc-bios/s390-ccw/virtio-ccw.h @@ -0,0 +1,24 @@ +/* + * 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 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 d557a4a90e..e747891a2c 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -109,6 +109,7 @@ struct VRing { }; typedef struct VRing VRing; =20 +char *virtio_get_ring_area(void); =20 /*********************************************** * Virtio block * @@ -270,8 +271,10 @@ struct VirtioCmd { }; typedef struct VirtioCmd VirtioCmd; =20 +void vring_init(VRing *vr, VqInfo *info); +bool virtio_is_supported(VDev *vdev); 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); @@ -284,7 +287,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 fef192c934..e82d60bbb7 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -72,6 +72,7 @@ static int is_dev_possibly_bootable(int dev_no, int sch_n= o) Schib schib; int r; =20 + VDev *vdev =3D virtio_get_device(); blk_schid.sch_no =3D sch_no; r =3D stsch_err(blk_schid, &schib); if (r =3D=3D 3 || r =3D=3D -EIO) { @@ -91,7 +92,8 @@ static int is_dev_possibly_bootable(int dev_no, int sch_n= o) * Note: we always have to run virtio_is_supported() here to make * sure that the vdev.senseid data gets pre-initialized correctly */ - is_virtio =3D virtio_is_supported(blk_schid); + vdev->schid =3D blk_schid; + is_virtio =3D virtio_is_supported(vdev); =20 /* No specific devno given, just return whether the device is possibly= bootable */ if (dev_no < 0) { @@ -254,10 +256,12 @@ static int virtio_setup(void) puts("Network boot device detected"); return 0; case VIRTIO_ID_BLOCK: - ret =3D virtio_blk_setup_device(blk_schid); + vdev->schid =3D blk_schid; + ret =3D virtio_blk_setup_device(); break; case VIRTIO_ID_SCSI: - ret =3D virtio_scsi_setup_device(blk_schid); + vdev->schid =3D blk_schid; + ret =3D virtio_scsi_setup_device(); break; default: puts("\n! No IPL device available !\n"); diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c index a9521dff41..651cedf6ef 100644 --- a/pc-bios/s390-ccw/netmain.c +++ b/pc-bios/s390-ccw/netmain.c @@ -500,7 +500,7 @@ static bool find_net_dev(Schib *schib, int dev_no) continue; } enable_subchannel(net_schid); - if (!virtio_is_supported(net_schid)) { + if (!virtio_is_supported(virtio_get_device())) { continue; } if (virtio_get_device_type() !=3D VIRTIO_ID_NET) { diff --git a/pc-bios/s390-ccw/virtio-blkdev.c b/pc-bios/s390-ccw/virtio-blk= dev.c index f40a9407c2..87ab9a9513 100644 --- a/pc-bios/s390-ccw/virtio-blkdev.c +++ b/pc-bios/s390-ccw/virtio-blkdev.c @@ -12,6 +12,7 @@ #include "s390-ccw.h" #include "virtio.h" #include "virtio-scsi.h" +#include "virtio-ccw.h" =20 #define VIRTIO_BLK_F_GEOMETRY (1 << 4) #define VIRTIO_BLK_F_BLK_SIZE (1 << 6) @@ -42,7 +43,7 @@ static int virtio_blk_read_many(VDev *vdev, unsigned long= sector, void *load_add /* Now we can tell the host to read */ vring_wait_reply(); =20 - if (drain_irqs(vr->schid)) { + if (drain_irqs(vr)) { /* Well, whatever status is supposed to contain... */ status =3D 1; } @@ -229,15 +230,19 @@ uint64_t virtio_get_blocks(void) } } =20 -int virtio_blk_setup_device(SubChannelId schid) +int virtio_blk_setup_device(void) { 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); =20 puts("Using virtio-blk."); =20 - return 0; + switch (virtio_get_device()->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + 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..e121826625 --- /dev/null +++ b/pc-bios/s390-ccw/virtio-ccw.c @@ -0,0 +1,242 @@ +/* + * Virtio functionality for CCW devices + * + * Copyright (c) 2013 Alexander Graf + * Copyright 2025 IBM Corp. Author(s): Jared Rossi + * + * This work is licensed under the terms of the GNU GPL, version 2 or (at + * your option) any later version. See the COPYING file in the top-level + * directory. + */ + +#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; +} + +static 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); +} + +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->dev_type =3D vdev->senseid.cu_model; + + if (vdev->senseid.cu_type =3D=3D 0x3832) { + switch (vdev->dev_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 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_ccw_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->dev_type) { + 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..6ab0f755f2 100644 --- a/pc-bios/s390-ccw/virtio-scsi.c +++ b/pc-bios/s390-ccw/virtio-scsi.c @@ -15,6 +15,7 @@ #include "virtio.h" #include "scsi.h" #include "virtio-scsi.h" +#include "virtio-ccw.h" #include "s390-time.h" #include "helper.h" =20 @@ -476,12 +477,11 @@ static int virtio_scsi_setup(VDev *vdev) return 0; } =20 -int virtio_scsi_setup_device(SubChannelId schid) +int virtio_scsi_setup_device(void) { VDev *vdev =3D virtio_get_device(); =20 - vdev->schid =3D schid; - virtio_setup_ccw(vdev); + 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 0f4f201038..0488b3a07e 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -2,6 +2,7 @@ * Virtio driver bits * * Copyright (c) 2013 Alexander Graf + * Copyright 2025 IBM Corp. Author(s): Jared Rossi * * This work is licensed under the terms of the GNU GPL, version 2 or (at * your option) any later version. See the COPYING file in the top-level @@ -13,6 +14,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" @@ -44,69 +46,38 @@ VirtioDevType virtio_get_device_type(void) return vdev.dev_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) +int drain_irqs(VRing *vr) { - 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; - } + switch (vdev.ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return drain_irqs_ccw(vr->schid); + default: + return 0; } } =20 -static int run_ccw(VDev *vdev, int cmd, void *ptr, int len, bool sli) +int virtio_run(VDev *vdev, int vqid, VirtioCmd *cmd) { - 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 (vdev->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_run(vdev, vqid, cmd); + default: + return -1; } - - return do_cio(vdev->schid, vdev->dev_type, ptr2u32(&ccw), CCW_FMT1); } =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 +105,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 (vdev.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 @@ -200,165 +176,24 @@ int vring_wait_reply(void) return 1; } =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; - } - return 0; -} - int virtio_reset(VDev *vdev) { - return run_ccw(vdev, CCW_CMD_VDEV_RESET, NULL, 0, false); -} - -int virtio_setup_ccw(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->dev_type) { - 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; + switch (vdev->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_reset(vdev); 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 -1; } - - return 0; } =20 -bool virtio_is_supported(SubChannelId schid) +bool virtio_is_supported(VDev *vdev) { - 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.sensei= d), - true)) { + switch (vdev->ipl_type) { + case S390_IPL_TYPE_QEMU_SCSI: + case S390_IPL_TYPE_CCW: + return virtio_ccw_is_supported(vdev->schid); + default: return false; } - - vdev.dev_type =3D vdev.senseid.cu_model; - - if (vdev.senseid.cu_type =3D=3D 0x3832) { - switch (vdev.dev_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..259cff09db 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 Sun Feb 8 19:28:05 2026 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=1765400146; cv=none; d=zohomail.com; s=zohoarc; b=b0nR3IL5Gg/PiZHh+l8af+2FlLJ093FNjW3JICKxMcuDxUy1ix/vEGg18wDJxTRWsVoJ6SGkAKJW76/OZQAChehLs7mF9RFKuWIexQzzcSLxCtrY+L26aWcXHgdB7P7L9g5JAXeqUmHzFeYhXJSGPepLgPLLgbhv6uuMdkrPWSk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400146; 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=YdYfyN1blE3v8GwcbcHjd5IQBKrbchD4XH2brVuaq4g=; b=CWd065beEIyDkLUB634FT20oQmN22oa8J0374ggPMSlB4hyBgHwxdyTiXwuXyQKnTCEuTmS/cFgS9xKzPQ6+WVolYxyzXnLqRv7DqMAIFgY7oLOoyDT1co07vf0FC2p4KXFK79CAo3fTrSrdQq4lle4ILyEYBwhoCkMZiFPwxQ0= 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 1765400145979397.4560715152128; Wed, 10 Dec 2025 12:55:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDJ-0004hB-GM; Wed, 10 Dec 2025 15:55:09 -0500 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 1vTRDG-0004dH-8R; Wed, 10 Dec 2025 15:55:06 -0500 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 1vTRDD-0000Wb-Rs; Wed, 10 Dec 2025 15:55:05 -0500 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5BAESjMW020535; Wed, 10 Dec 2025 20:55:02 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 4avc61mjdy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:02 +0000 (GMT) Received: from pps.filterd (ppma23.wdc07v.mail.ibm.com [127.0.0.1]) by ppma23.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 5BAJamil012432; Wed, 10 Dec 2025 20:55:01 GMT Received: from smtprelay04.wdc07v.mail.ibm.com ([172.16.1.71]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4aw0ak2r1r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:01 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay04.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 5BAKsxvx38994558 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:54:59 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4964058056; Wed, 10 Dec 2025 20:54:59 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9ADD658052; Wed, 10 Dec 2025 20:54:58 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:54:58 +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=YdYfyN1blE3v8Gwcb cHjd5IQBKrbchD4XH2brVuaq4g=; b=qVRRUagD+pWSkz4xrcw/Xpgt+h+If6clD vw8i6ZfjP8OchH/FLHkTINNTK34JgRJVMNflwj2YLMz2RwghnbVtLp1cwHvBjmfg lc3fTz3PlgOIHS9ECIZcKMILS1YMQxBvlGbZ4CoIfwaeg5BWFN98/PBY6hM4XQHU HTCsPbCSMUIvRpAezwcDXJOrCiv+3dy2Vy50mUlQT2cV02QmOctSwOW4TRG56d58 XXwpkJI0NzrJBtx9Y8up1BdNdIEnB7RdgP6VuTA+xLzQkrDP+J2OTjnWAsTjITSv +fsCSHC8TdzYf6UhjMQysRC/bJW+FQJ5qrhtnaFwIDg6PrEsCHU1A== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 04/10] include/hw/s390x: Move CLP definitions for easier BIOS access Date: Wed, 10 Dec 2025 15:54:43 -0500 Message-ID: <20251210205449.2783111-5-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAyMCBTYWx0ZWRfX1sPJCzRoNLSV Dg9V4Al4VdKq/6NfpBm3L60f0YTTJoeIuOqdnrlhiJGsG0llKlEfmoGqELarHYz6nkbn2/isdXQ Yt+2zmpRv8G+VA4duSJ7DDOoeL+2bQnFLFzo2/6JLWpPqY8oI/ZuXzciRPKQyP3cWqwv5KXKLs6 OMmHxbmHAk94My2r9NFChfBxaS7dqy8BLDzJfGfF3HBc4qTsycyhHCQgDGwbkfBDmTufhTVAraJ I6iiNHXUNhTNf2FNfximz5RVJZAzbTeuCFMfp151+cYkCfjXFJrUl0cJxkw8YeQbKQo1d2MwAkg 63jfga2/42BNsZ795+XlAp8iaI6Zp6KbrHrLLpoBFT0DDlAKXwqPiLUPyv6QvBfnRa82lAFisFw 6q34fjdcTsPzzht+7jCVSi/IWAZ0Dg== X-Proofpoint-GUID: DufOk4dB8I8l_Su8axjQu45ROhI--oLP X-Proofpoint-ORIG-GUID: DufOk4dB8I8l_Su8axjQu45ROhI--oLP X-Authority-Analysis: v=2.4 cv=O/U0fR9W c=1 sm=1 tr=0 ts=6939de26 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=ywRehXNDCqtWCsHy2Z0A:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 phishscore=0 suspectscore=0 adultscore=0 spamscore=0 malwarescore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060020 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: 1765400147760158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi Move the s390-pci-clp definitions into the "ipl" sub-directory, which is vi= sible to the s390-bios. This allows the bios to reuse the architected definition= s and prevents code duplication. Signed-off-by: Jared Rossi Reviewed-by: Thomas Huth --- include/hw/s390x/{ =3D> ipl}/s390-pci-clp.h | 0 include/hw/s390x/s390-pci-bus.h | 2 +- hw/s390x/s390-pci-vfio.c | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename include/hw/s390x/{ =3D> ipl}/s390-pci-clp.h (100%) diff --git a/include/hw/s390x/s390-pci-clp.h b/include/hw/s390x/ipl/s390-pc= i-clp.h similarity index 100% rename from include/hw/s390x/s390-pci-clp.h rename to include/hw/s390x/ipl/s390-pci-clp.h diff --git a/include/hw/s390x/s390-pci-bus.h b/include/hw/s390x/s390-pci-bu= s.h index 04944d4fed..f643e13057 100644 --- a/include/hw/s390x/s390-pci-bus.h +++ b/include/hw/s390x/s390-pci-bus.h @@ -19,7 +19,7 @@ #include "hw/s390x/sclp.h" #include "hw/s390x/s390_flic.h" #include "hw/s390x/css.h" -#include "hw/s390x/s390-pci-clp.h" +#include "hw/s390x/ipl/s390-pci-clp.h" #include "qom/object.h" =20 #define TYPE_S390_PCI_HOST_BRIDGE "s390-pcihost" diff --git a/hw/s390x/s390-pci-vfio.c b/hw/s390x/s390-pci-vfio.c index 9e31029d7a..8ce44dbecc 100644 --- a/hw/s390x/s390-pci-vfio.c +++ b/hw/s390x/s390-pci-vfio.c @@ -17,7 +17,7 @@ =20 #include "trace.h" #include "hw/s390x/s390-pci-bus.h" -#include "hw/s390x/s390-pci-clp.h" +#include "hw/s390x/ipl/s390-pci-clp.h" #include "hw/s390x/s390-pci-vfio.h" #include "hw/vfio/pci.h" #include "hw/vfio/vfio-container-legacy.h" --=20 2.49.0 From nobody Sun Feb 8 19:28:05 2026 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=1765400237; cv=none; d=zohomail.com; s=zohoarc; b=V2ncRrfnQ+WAJRW9LUwgAa1aBhKrTFRwid5K3yMwmoYU8QXNXZwmnUi/QifXfx4LH9DMcNRYSNuMrum19uIXwcHWq7O30LljDrQvLrL91lXlqrFUQb6KbGLsjtSHYa5P9a6pFVeJJNfQb7dBWbQ9cp/EQGwtjWfUwN3x/fQYVM8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400236; 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=uSAqjqF+gJMVXccwzx+qNkuenaAbjiZEfc2myGVcWjE=; b=gmT5ZrParrORKeEl1uh+0AYcjDU9r+1LENiz3znpaSLQmptYvanPHYPqhbhsgY60+vvd75AQFRwaTdo4gpsRl/kStLFqp7r4vVKQEj8kHu5TMzZrEpjBtZ5QX7lljMV1KGc49MMgHFygCEtZrnJ3nn6U0A8ksn+9Sy+vZrHQx1M= 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 1765400236992649.0932262563484; Wed, 10 Dec 2025 12:57:16 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDM-0004iY-Hb; Wed, 10 Dec 2025 15:55:12 -0500 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 1vTRDH-0004eS-S5; Wed, 10 Dec 2025 15:55:08 -0500 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 1vTRDG-0000gr-2g; Wed, 10 Dec 2025 15:55:07 -0500 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 5BAK0EZl026189; Wed, 10 Dec 2025 20:55:04 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 4avc0k4hxa-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:03 +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 5BAJTlRH028141; Wed, 10 Dec 2025 20:55:02 GMT Received: from smtprelay05.wdc07v.mail.ibm.com ([172.16.1.72]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4avy6y2wkw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:02 +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 5BAKt0Gb34079390 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:55:01 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D80EB5805D; Wed, 10 Dec 2025 20:55:00 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2E94258052; Wed, 10 Dec 2025 20:55:00 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:55:00 +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=uSAqjqF+gJMVXccwz x+qNkuenaAbjiZEfc2myGVcWjE=; b=iVnPxq2YnnyhD/5gcdYw7BLZHJ2obFy+f BbmyItB2oDWgzXpKbQT+YRBU2+9roCKlPr7IZpE7hMpNZ2f7gx6HKY+SL2eos+Gp jblFS7hL9hngg0n6RMZVkmEg5KqlvAVSlA+HSutu2q0dmfUq+VoLkWENNi7pEgwK DXxpclQotDcki09HXJBg7Lf2BscptcH1adPatdc474A04eeG4mKydBoAnQ/mVPO6 zcnYWwGY1Z90P3s/Aeuy7SBo0gExaxcVppxvWieIGakFZCGuqNs9Q73tiWya3mIt XNKNI+cbRC8uudaetZWMJuL72apT4SQkIABnFlMdh4svHRA8bul3Q== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 05/10] pc-bios/s390-ccw: Introduce CLP Architecture Date: Wed, 10 Dec 2025 15:54:44 -0500 Message-ID: <20251210205449.2783111-6-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-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=Cf8FJbrl c=1 sm=1 tr=0 ts=6939de27 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=B6FfjjnMrpp8agTJrekA:9 X-Proofpoint-ORIG-GUID: 8QvwgJ7Nyeq3Xmqm5jPbJg9egvsZtNlq X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAxNiBTYWx0ZWRfX91Dotx28xnR6 rLxM2p9VFwv/JiSRf7XZzUOMpxjuqG8AMG//iS5sTS/kFBXqVSGejv2Dhys4GHhVcZDjwHyK/n4 lY3A8OeIED+yyhHbo4ntpoiOKg2F7ARn0CL3uky3Uwu8F1AHQKHvr3ERrkuwmxHLnQq9io2oyLc NXFiXjr8Q7olt53NpK5BJA0KrPspo2wKTpYfFpPyc/79PNW+9uEDSK2DV0Se6WRZ15M2Bph6UPB Ynf1JaY2e/jFndZU0uAcuTxw2mVfPMFjlvI+joo1eVfDvaWrg94fWXiTOyLZ1q+fJGUZiuUalIX TiO+8TCorArlgllhsjaqiOZxFBQ80G+uCRzRgqUTb3FFBmFmbqdtPsVPz81bNQtoxCtHLoLsYxQ 8Qi2wJQZk1r/DZX+c/3wWECK1R3+Xg== X-Proofpoint-GUID: 8QvwgJ7Nyeq3Xmqm5jPbJg9egvsZtNlq X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 bulkscore=0 malwarescore=0 clxscore=1015 adultscore=0 lowpriorityscore=0 impostorscore=0 priorityscore=1501 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060016 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: 1765400238060158500 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. Signed-off-by: Jared Rossi --- pc-bios/s390-ccw/clp.h | 24 ++++++++++ pc-bios/s390-ccw/clp.c | 96 +++++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/Makefile | 2 +- 3 files changed, 121 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..1ac2f8c177 --- /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 + +int clp_pci(void *data); +int find_pci_function(uint32_t fid, ClpFhListEntry *entry); +int enable_pci_function(uint32_t *fhandle); + +#endif diff --git a/pc-bios/s390-ccw/clp.c b/pc-bios/s390-ccw/clp.c new file mode 100644 index 0000000000..6dc72c685c --- /dev/null +++ b/pc-bios/s390-ccw/clp.c @@ -0,0 +1,96 @@ +/* + * 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 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 { + if (clp_pci(&rrb) || (rrb.response.hdr.rsp !=3D 0x0010)) { + puts("Failed to list PCI functions"); + 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); + + puts("No function entry found for FID!"); + + 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; + + 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; + + if (clp_pci(&rrb) || (rrb.response.hdr.rsp !=3D 0x0010)) { + puts("Failed to enable PCI function"); + return -1; + } + + *fhandle =3D rrb.response.fh; + return 0; +} diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index 259cff09db..9c29548f84 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 Sun Feb 8 19:28:05 2026 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=1765400231; cv=none; d=zohomail.com; s=zohoarc; b=dMlLBOqcxlTwGYaVzmh2DpNK60JBrozmOoBLpGJHKHWdSj7vWg9+t/5g1ignQtJ5A1KHowu0JwCyCTTWoRmgzH2zLiWjmrkIeuR03pk/4blginfq0N2+trmDBFzK/NRAbDBd+XhSEAPtUXlpfpT1/EBWXindcEc8qL+MvDxUyTk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400231; 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=TL43jz2LUqtDoSE7sEIEmJxom27TbhcP7fyDxHQYIS0=; b=a5fb5UxkXj8Ulux1csuiGV7Le5vq2rVpmk1kbbh7TT4rK208G7kJhGAIXfUNMe5Xrwn9RTmIwd4PN8IbILhfAGFNk5VnlaTtidPS5m062dwiEsqyJ1HJhHtAO5BCO+4i5+pdN1Bg80sySfQSDtXDj8lV9jRMnUcV9AiE7JXvkeM= 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 1765400231963145.0775098128238; Wed, 10 Dec 2025 12:57:11 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDL-0004i1-3J; Wed, 10 Dec 2025 15:55:11 -0500 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 1vTRDI-0004fy-Lu; Wed, 10 Dec 2025 15:55:08 -0500 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 1vTRDG-0000hE-Fo; Wed, 10 Dec 2025 15:55:08 -0500 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 5BAJoxAX001890; Wed, 10 Dec 2025 20:55:05 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 4avc53kvsm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:05 +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 5BAKqAIQ026836; Wed, 10 Dec 2025 20:55:04 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4aw1h1ag0d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:04 +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 5BAKt2JT15663750 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:55:02 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 6140E58056; Wed, 10 Dec 2025 20:55:02 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AA33758067; Wed, 10 Dec 2025 20:55:01 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:55:01 +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=TL43jz2LUqtDoSE7s EIEmJxom27TbhcP7fyDxHQYIS0=; b=kNiaDA94hmI8GRlyqoh9zSyrOiOsJDKU/ 6lFf9y7JLst/ZNl0B58vj1/AP8J3AScGjM5/3VjgfxzxwwKp4hgP0A8yLXvvf2hd hiLjxU+iAxmbsJbIdburh5X9QnMILRo0aUD0g46YHMKOx1+SOSEkBUPbGH0nFn5h X8os3VKLR2LM9+1dkndgnl+Fw2jUQB+jxDBgFbWBDTNB3j54CxRI9+7BVv0MXjVr VTij/T7+uToypeOpnzQGV4nPXf5Y25L+pJKl1PGpJHyPU5AN0LLNhrnESBAjx5Ul 5m104tpPmxuOUjsD1Ts5HYipldiYM8DOTQn3IcaLRZYxmwAvSjT7w== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 06/10] pc-bios/s390-ccw: Introduce PCI device Date: Wed, 10 Dec 2025 15:54:45 -0500 Message-ID: <20251210205449.2783111-7-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAyMCBTYWx0ZWRfX6FnD6Bmj3Zb5 +lP8oBqexIaS2lcf9utaLproxQjSZR0RijW+TZ1uLdMhQkwEKBLkbcLXNC65kcGuSitQErD4p7k F0yuBgdGSDdwxakRULFtZbVx9prx1+u4t47t4MxLi/ReDqLjP7gBcpt5+km3X9ZstW7DSkyPOAL zOlpoQqiqVMZxNgYh5sA3QautEEFngfvj9lsJBCMok4N/eyDUEziHmZS2R9jGB+JAXpSKKnABcZ W/77C18QgQMIpxCsUEv+0f6o89wSpBt+KBnitp9FKpio4oSuB/3W4Q75weiyTavR086GIPiHDyZ fySao9oKesN+je/3cutiDhbojh/qkHbJIShlf0TPlaz8dSxxyRybWWZDdOhuGdgCJJ25xj6Nqok pf96P0pESJwpOz68d/DjgVqjwsaNDg== X-Authority-Analysis: v=2.4 cv=S/DUAYsP c=1 sm=1 tr=0 ts=6939de29 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=ThZcmqG5OktQ-sC9OvEA:9 X-Proofpoint-ORIG-GUID: se64Rm6h1hS6rTu6ix9oXOyabLWdkbK2 X-Proofpoint-GUID: se64Rm6h1hS6rTu6ix9oXOyabLWdkbK2 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 impostorscore=0 suspectscore=0 lowpriorityscore=0 adultscore=0 spamscore=0 bulkscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060020 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: 1765400234049158500 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 --- pc-bios/s390-ccw/pci.h | 88 ++++++++++ pc-bios/s390-ccw/pci.c | 331 ++++++++++++++++++++++++++++++++++++++ pc-bios/s390-ccw/Makefile | 2 +- 3 files changed, 420 insertions(+), 1 deletion(-) create mode 100644 pc-bios/s390-ccw/pci.h create mode 100644 pc-bios/s390-ccw/pci.c diff --git a/pc-bios/s390-ccw/pci.h b/pc-bios/s390-ccw/pci.h new file mode 100644 index 0000000000..847cf3f194 --- /dev/null +++ b/pc-bios/s390-ccw/pci.h @@ -0,0 +1,88 @@ +/* + * 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 +#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_CFGBAR 0xF /* Base Address Register for config sp= ace */ +#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_flex(uint32_t fhandle, uint64_t offset, uint8_t pcias, void = *data, int len); +int pci_write_byte(uint32_t fhandle, uint64_t offset, uint8_t pcias, uint8= _t data); +int pci_bswap16_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, ui= nt16_t data); +int pci_bswap32_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, ui= nt32_t data); +int pci_bswap64_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, ui= nt64_t data); + +int pci_read_flex(uint32_t fhandle, uint64_t offset, uint8_t pcias, void *= buf, int len); +int pci_read_bswap64(uint32_t fhandle, uint64_t offset, uint8_t pcias, uin= t64_t *buf); +int pci_read_bswap32(uint32_t fhandle, uint64_t offset, uint8_t pcias, uin= t32_t *buf); +int pci_read_bswap16(uint32_t fhandle, uint64_t offset, uint8_t pcias, uin= t16_t *buf); +int pci_read_byte(uint32_t fhandle, uint64_t offset, uint8_t pcias, uint8_= t *buf); + +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..c149789386 --- /dev/null +++ b/pc-bios/s390-ccw/pci.c @@ -0,0 +1,331 @@ +/* + * 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 "bswap.h" +#include +#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; + + 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; +} + +static int pci_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, + uint64_t data, uint8_t len) +{ + + uint64_t req =3D ZPCI_CREATE_REQ(fhandle, pcias, len); + uint8_t status; + int rc; + + /* writes must be non-zero powers of 2 with a maximum of 8 bytes per r= ead */ + switch (len) { + case 1: + case 2: + case 4: + case 8: + rc =3D pcistg(data, req, offset, &status); + break; + default: + rc =3D -1; + } + + /* Error condition detected */ + if (rc =3D=3D 1) { + printf("PCI store failed with status condition %d\n", status); + return -1; + } + + return rc ? -1 : 0; +} + +/* Write an arbitrary length of data without byte swapping */ +int pci_write_flex(uint32_t fh, uint64_t offset, uint8_t pcias, void *data= , int len) +{ + uint8_t writelen, tmp; + int rc; + int remaining =3D len; + + /* write bytes in powers of 2, up to a maximum of 8 bytes per read */ + while (remaining) { + if (remaining > 7) { + writelen =3D 8; + } else { + writelen =3D 1; + while (true) { + tmp =3D writelen * 2; + if (tmp > remaining) { + break; + } + + writelen =3D tmp; + } + } + + /* Access next data based on write size */ + switch (writelen) { + case 1: + rc =3D pci_write(fh, offset, pcias, ((uint8_t *)data)[0], 1); + break; + case 2: + rc =3D pci_write(fh, offset, pcias, ((uint16_t *)data)[0], 2); + break; + case 4: + rc =3D pci_write(fh, offset, pcias, ((uint32_t *)data)[0], 4); + break; + case 8: + rc =3D pci_write(fh, offset, pcias, ((uint64_t *)data)[0], 8); + break; + default: + rc =3D -1; + } + + if (rc) { + return -1; + } + + remaining -=3D writelen; + data +=3D writelen; + offset +=3D writelen; + } + + return 0; +} + +int pci_write_byte(uint32_t fhandle, uint64_t offset, uint8_t pcias, uint8= _t data) +{ + return pci_write(fhandle, offset, pcias, (uint64_t)data, 1); +} + +/* Wrappers to byte swap common data sizes then write */ +int pci_bswap16_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, ui= nt16_t data) +{ + uint64_t le_data =3D bswap16(data); + return pci_write(fhandle, offset, pcias, le_data, 2); +} + +int pci_bswap32_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, ui= nt32_t data) +{ + uint64_t le_data =3D bswap32(data); + return pci_write(fhandle, offset, pcias, le_data, 4); +} + +int pci_bswap64_write(uint32_t fhandle, uint64_t offset, uint8_t pcias, ui= nt64_t data) +{ + uint64_t le_data =3D bswap64(data); + return pci_write(fhandle, offset, pcias, le_data, 8); +} + +static int pci_read(uint32_t fh, uint64_t offset, uint8_t pcias, void *buf= , uint8_t len) +{ + uint64_t req, data; + uint8_t status; + int rc; + + req =3D ZPCI_CREATE_REQ(fh, pcias, len); + rc =3D pcilg(&data, req, offset, &status); + + /* Error condition detected */ + if (rc =3D=3D 1) { + printf("PCI load failed with status condition %d\n", status); + return -1; + } + + switch (len) { + case 1: + *(uint8_t *)buf =3D data; + break; + case 2: + *(uint16_t *)buf =3D data; + break; + case 4: + *(uint32_t *)buf =3D data; + break; + case 8: + *(uint64_t *)buf =3D data; + break; + default: + return -1; + } + + return rc ? -1 : 0; +} + +/* Read to an arbitrary length buffer without byte swapping */ +int pci_read_flex(uint32_t fh, uint64_t offset, uint8_t pcias, void *buf, = int len) +{ + uint8_t readlen, tmp; + int rc; + int remaining =3D len; + + /* Read bytes in powers of 2, up to a maximum of 8 bytes per read */ + while (remaining) { + if (remaining > 7) { + readlen =3D 8; + } else { + readlen =3D 1; + while (true) { + tmp =3D readlen * 2; + if (tmp > remaining) { + break; + } + + readlen =3D tmp; + } + } + + rc =3D pci_read(fh, offset, pcias, buf, readlen); + if (rc) { + return -1; + } + + remaining -=3D readlen; + buf +=3D readlen; + offset +=3D readlen; + } + + return 0; +} + +int pci_read_byte(uint32_t fh, uint64_t offset, uint8_t pcias, uint8_t *bu= f) +{ + return pci_read(fh, offset, pcias, buf, 1); +} + +/* Wrappers to read common data sizes then byte swap */ +int pci_read_bswap16(uint32_t fh, uint64_t offset, uint8_t pcias, uint16_t= *buf) +{ + int rc =3D pci_read(fh, offset, pcias, buf, 2); + *buf =3D bswap16(*buf); + return rc; +} + +int pci_read_bswap32(uint32_t fh, uint64_t offset, uint8_t pcias, uint32_t= *buf) +{ + int rc =3D pci_read(fh, offset, pcias, buf, 4); + *buf =3D bswap32(*buf); + return rc; +} + +int pci_read_bswap64(uint32_t fh, uint64_t offset, uint8_t pcias, uint64_t= *buf) +{ + int rc =3D pci_read(fh, offset, pcias, buf, 8); + *buf =3D bswap64(*buf); + return rc; +} + +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 9c29548f84..a62fc9d766 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 Sun Feb 8 19:28:05 2026 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=1765400217; cv=none; d=zohomail.com; s=zohoarc; b=dakD75ERyN3p2gZw/uY/UQG7IguwWZPi3TyaQ+Vl+mbmr1NY/eJAXifym0HLDJ6bSDCB/Spl9HsvslLv4KbMw38NRVO41cDx9wUxbSiSAjPlTyOsaGxHLm+fWMGQYjyx77pKvygEWmTvWnR4zdByAoP8oeHVS0QFDz7az2Q7SQc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400217; 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=j9b2OlZaviAqRS5Lpx02NyhJjgvqSgIqzJWztAoiN9g=; b=iWuoTYtJBSqODFME9vZiGhQHkB4/Vfr69hM4vQwU1PnAsvTmrLU07hwAxFcS7hLSXsXewQOk5MDCdBC0kl5kSLF1z9VdVpMl8wd3cVfJuLt52Y2ir4PkPAVFStLzOGhvHUBQV+iTFrMlnGja3kDJ7Ju7NwlDn82Q1DZwrACELvs= 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 1765400217745919.5919936369504; Wed, 10 Dec 2025 12:56:57 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDO-0004kZ-Vg; Wed, 10 Dec 2025 15:55:15 -0500 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 1vTRDK-0004hn-Ip; Wed, 10 Dec 2025 15:55:10 -0500 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 1vTRDH-0000hS-3x; Wed, 10 Dec 2025 15:55:09 -0500 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 5BAFvUQZ032406; Wed, 10 Dec 2025 20:55:06 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 4avawvc09b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:05 +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 5BAKBYJn012807; Wed, 10 Dec 2025 20:55:05 GMT Received: from smtprelay03.dal12v.mail.ibm.com ([172.16.1.5]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4aw0ak2r23-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:05 +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 5BAKt3xE17760894 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:55:04 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DE49758052; Wed, 10 Dec 2025 20:55:03 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2C40558065; Wed, 10 Dec 2025 20:55:03 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:55:03 +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=j9b2OlZaviAqRS5Lp x02NyhJjgvqSgIqzJWztAoiN9g=; b=b/CyHCDaW5eOs+ovos4fVsxxZlwPoJA8l PTONhQlW1pz5DFFCMNncupE7UHovzvM4RXRHFZIB9YI+fVGpVXjUmFNhHiR3eRhD RFm2bZt/H3vZL2E/fbe+/0Ad/929rsEFuCbPyHiU2DAehhbAMLOqCMgQczR1nzPn eU3noyXf/lNhMsW8H0mIrMS++g942yuH4Q+LW45CSDVDWqUom3XvRgJxPneVWy6J 1lIxLOkeOaPd8YAuUXo7Emb00ZU1iV4cchYQaaYMIrOe79qaXKM8/P4A4IeH8Hqx dw8iObgU5HnJN07qb0VuSv/W4dAJKqTCL81GIrn0AEtobW/V4JjNQ== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 07/10] pc-bios/s390-ccw: Add support for virtio-blk-pci IPL Date: Wed, 10 Dec 2025 15:54:46 -0500 Message-ID: <20251210205449.2783111-8-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: VjvZSPZvbRPTJZhGXmBWvkfkyny5WMdN X-Proofpoint-ORIG-GUID: VjvZSPZvbRPTJZhGXmBWvkfkyny5WMdN X-Authority-Analysis: v=2.4 cv=aY9sXBot c=1 sm=1 tr=0 ts=6939de29 cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=YDWSy8wavFdjhzYS9UUA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAwNyBTYWx0ZWRfX2M2iP/j6iNi7 7yRF3ylUMmEGENg6/Il54R2uGyVxmqqm16Yta1/0pI4dHn4v0TBkprfHCj+/sqSpgBwR5ihKiAU Iqp6wpEVebJPqQmKX2THR655J04b/soHFh00TAdpPH4I94YfngQ/2O81DRoWVpnRttvG+EimHRD cVMd2xD3VMdvZHHTKCiEv9WaH1CSafjJJOLdlXHN9NdtypZqfD3NQKHpEusf1P6/VNRE3VE/sKU 0QOtnM4n+4UxT2aa2bfMm+XtGML+kN3Y+af8b3dcdI2t0GA9mJDCQZS4yxIvfAz2HVFbVVUOHYA 5peoFJD4aBIVUuNm8q/U+XglSbzxfxP2aVy5+1meezOL6osRcMlk1/enAa0Wh2TK04AYeEwooC5 8hUOZ7ugIu1ST1ClkxYHAVZRGg/2dg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1015 phishscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 impostorscore=0 malwarescore=0 priorityscore=1501 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060007 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: 1765400218063158501 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 --- include/hw/s390x/ipl/qipl.h | 10 + pc-bios/s390-ccw/virtio-pci.h | 79 +++++++ pc-bios/s390-ccw/virtio.h | 1 + pc-bios/s390-ccw/main.c | 60 +++++- pc-bios/s390-ccw/virtio-blkdev.c | 3 + pc-bios/s390-ccw/virtio-pci.c | 360 +++++++++++++++++++++++++++++++ pc-bios/s390-ccw/virtio.c | 5 + pc-bios/s390-ccw/Makefile | 2 +- 8 files changed, 517 insertions(+), 3 deletions(-) create mode 100644 pc-bios/s390-ccw/virtio-pci.h create mode 100644 pc-bios/s390-ccw/virtio-pci.c diff --git a/include/hw/s390x/ipl/qipl.h b/include/hw/s390x/ipl/qipl.h index 8199b839f0..5c7779a1c3 100644 --- a/include/hw/s390x/ipl/qipl.h +++ b/include/hw/s390x/ipl/qipl.h @@ -22,6 +22,7 @@ =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 =20 @@ -105,6 +106,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; @@ -120,6 +129,7 @@ union IplParameterBlock { IplBlockFcp fcp; IPLBlockPV pv; IplBlockQemuScsi scsi; + IplBlockPci pci; }; } QEMU_PACKED; struct { diff --git a/pc-bios/s390-ccw/virtio-pci.h b/pc-bios/s390-ccw/virtio-pci.h new file mode 100644 index 0000000000..b203f37aea --- /dev/null +++ b/pc-bios/s390-ccw/virtio-pci.h @@ -0,0 +1,79 @@ +/* + * 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 VPCI_CAP_COMMON_CFG 1 +/* Notifications */ +#define VPCI_CAP_NOTIFY_CFG 2 +/* ISR access */ +#define VPCI_CAP_ISR_CFG 3 +/* Device specific configuration */ +#define VPCI_CAP_DEVICE_CFG 4 +/* PCI configuration access */ +#define VPCI_CAP_PCI_CFG 5 +/* Additional shared memory capability */ +#define VPCI_CAP_SHARED_MEMORY_CFG 8 +/* PCI vendor data configuration */ +#define VPCI_CAP_VENDOR_CFG 9 + +/* Offsets within capability header */ +#define VPCI_CAP_VNDR 0 +#define VPCI_CAP_NEXT 1 +#define VPCI_CAP_LEN 2 +#define VPCI_CAP_CFG_TYPE 3 +#define VPCI_CAP_BAR 4 +#define VPCI_CAP_OFFSET 8 +#define VPCI_CAP_LENGTH 12 + +#define VPCI_N_CAP_MULT 16 /* Notify multiplier, VPCI_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 + +struct VirtioPciCap { + uint8_t bar; /* Which PCIAS it's in */ + uint32_t off; /* Offset within bar */ +}; +typedef struct VirtioPciCap VirtioPciCap; + +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 e747891a2c..cc68c2f8a9 100644 --- a/pc-bios/s390-ccw/virtio.h +++ b/pc-bios/s390-ccw/virtio.h @@ -256,6 +256,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 e82d60bbb7..562eeede63 100644 --- a/pc-bios/s390-ccw/main.c +++ b/pc-bios/s390-ccw/main.c @@ -15,7 +15,9 @@ #include "s390-arch.h" #include "s390-ccw.h" #include "cio.h" +#include "clp.h" #include "virtio.h" +#include "virtio-pci.h" #include "virtio-scsi.h" #include "dasd-ipl.h" =20 @@ -151,6 +153,21 @@ 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->dev_type !=3D 0; +} + static void menu_setup(void) { if (memcmp(loadparm_str, LOADPARM_PROMPT, LOADPARM_LEN) =3D=3D 0) { @@ -238,6 +255,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"); } @@ -276,7 +296,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: @@ -289,7 +309,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->dev_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->dev_type); + } +} + +static void ipl_boot_device(void) +{ + switch (virtio_get_device()->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 87ab9a9513..0542b4feee 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-scsi.h" #include "virtio-ccw.h" +#include "virtio-pci.h" =20 #define VIRTIO_BLK_F_GEOMETRY (1 << 4) #define VIRTIO_BLK_F_BLK_SIZE (1 << 6) @@ -242,6 +243,8 @@ int virtio_blk_setup_device(void) case S390_IPL_TYPE_QEMU_SCSI: case S390_IPL_TYPE_CCW: 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..838231d86c --- /dev/null +++ b/pc-bios/s390-ccw/virtio-pci.c @@ -0,0 +1,360 @@ +/* + * 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 regions */ +VirtioPciCap c_cap; /* Common capabilities */ +VirtioPciCap d_cap; /* Device capabilities */ +VirtioPciCap n_cap; /* Notify capabilities */ +uint32_t notify_mult; +uint16_t q_notify_offset; + +static int virtio_pci_set_status(VDev *vdev, uint8_t status) +{ + int rc =3D pci_write_byte(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_STAT= US, + c_cap.bar, status); + if (rc) { + puts("Failed to write virtio-pci status"); + return -EIO; + } + + return 0; +} + +static int virtio_pci_get_status(VDev *vdev, uint8_t *status) +{ + int rc =3D pci_read_byte(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_STATU= S, + c_cap.bar, status); + if (rc) { + puts("Failed to read virtio-pci status"); + return -EIO; + } + + 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. + */ +static uint8_t find_cap_pos(uint32_t fhandle, uint8_t cfg_type) +{ + uint8_t next, cfg; + int rc; + + rc =3D pci_read_byte(fhandle, PCI_CAPABILITY_LIST, PCI_CFGBAR, &next); + rc |=3D pci_read_byte(fhandle, next + 3, PCI_CFGBAR, &cfg); + + while (!rc && (cfg !=3D cfg_type) && next) { + rc =3D pci_read_byte(fhandle, next + 1, PCI_CFGBAR, &next); + rc |=3D pci_read_byte(fhandle, next + 3, PCI_CFGBAR, &cfg); + } + + return rc ? 0 : next; +} + +static int virtio_pci_get_hfeatures(VDev *vdev, uint64_t *features) +{ + uint32_t feat0, feat1; + int rc; + + rc =3D pci_bswap32_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_DFSEL= ECT, + c_cap.bar, 0); + + rc |=3D pci_read_bswap32(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_DF, + c_cap.bar, &feat0); + + rc |=3D pci_bswap32_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_DFSE= LECT, + c_cap.bar, 1); + + rc |=3D pci_read_bswap32(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_DF, + c_cap.bar, &feat1); + + if (rc) { + puts("Failed to get PCI feature bits"); + return -EIO; + } + + *features =3D (uint64_t) feat1 << 32; + *features |=3D (uint64_t) feat0; + + return 0; +} + +static int virtio_pci_set_gfeatures(VDev *vdev) +{ + int rc; + + rc =3D pci_bswap32_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_GFSEL= ECT, + c_cap.bar, 0); + + rc |=3D pci_bswap32_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_GF, + c_cap.bar, vdev->guest_features[1]); + + rc |=3D pci_bswap32_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_GFSE= LECT, + c_cap.bar, 1); + + rc |=3D pci_bswap32_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_GF, + c_cap.bar, vdev->guest_features[0]); + + if (rc) { + puts("Failed to set PCI feature bits"); + return -EIO; + } + + return 0; +} + +static int virtio_pci_get_blk_config(VDev *vdev) +{ + return pci_read_flex(vdev->pci_fh, d_cap.off, d_cap.bar, &vdev->config= .blk, + sizeof(VirtioBlkConfig)); +} + +/* virtio spec v1.3 section 4.1.2.1 */ +void virtio_pci_id2type(VDev *vdev, uint16_t device_id) +{ + switch (device_id) { + case 0x1001: + vdev->dev_type =3D VIRTIO_ID_BLOCK; + break; + case 0x1000: /* Other valid but currently unsupported virtio device ty= pes */ + case 0x1004: + default: + vdev->dev_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; + int rc; + + /* Common capabilities */ + pos =3D find_cap_pos(vdev->pci_fh, VPCI_CAP_COMMON_CFG); + if (!pos) { + puts("Failed to locate PCI common configuration"); + return 1; + } + + rc =3D pci_read_byte(vdev->pci_fh, pos + VPCI_CAP_BAR, PCI_CFGBAR, &c_= cap.bar); + if (rc || pci_read_bswap32(vdev->pci_fh, pos + VPCI_CAP_OFFSET, PCI_CF= GBAR, + &c_cap.off)) { + puts("Failed to read PCI common configuration"); + return -EIO; + } + + /* Device capabilities */ + pos =3D find_cap_pos(vdev->pci_fh, VPCI_CAP_DEVICE_CFG); + if (!pos) { + puts("Failed to locate PCI device configuration"); + return 1; + } + + rc =3D pci_read_byte(vdev->pci_fh, pos + VPCI_CAP_BAR, PCI_CFGBAR, &d_= cap.bar); + if (rc || pci_read_bswap32(vdev->pci_fh, pos + VPCI_CAP_OFFSET, PCI_CF= GBAR, + &d_cap.off)) { + puts("Failed to read PCI device configuration"); + return -EIO; + } + + /* Notification capabilities */ + pos =3D find_cap_pos(vdev->pci_fh, VPCI_CAP_NOTIFY_CFG); + if (!pos) { + puts("Failed to locate PCI notification configuration"); + return 1; + } + + rc =3D pci_read_byte(vdev->pci_fh, pos + VPCI_CAP_BAR, PCI_CFGBAR, &n_= cap.bar); + if (rc || pci_read_bswap32(vdev->pci_fh, pos + VPCI_CAP_OFFSET, PCI_CF= GBAR, + &n_cap.off)) { + puts("Failed to read PCI notification configuration"); + return -EIO; + } + + rc =3D pci_read_bswap32(vdev->pci_fh, pos + VPCI_N_CAP_MULT, PCI_CFGBA= R, ¬ify_mult); + if (rc || pci_read_bswap16(vdev->pci_fh, d_cap.off + VPCI_C_OFFSET_Q_N= OFF, + d_cap.bar, &q_notify_offset)) { + puts("Failed to read notification queue configuration"); + return -EIO; + } + + 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_set_selected_vq(VDev *vdev, uint16_t queue_num) +{ + return pci_bswap16_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_Q_SEL= ECT, + c_cap.bar, queue_num); +} + +int virtio_pci_set_queue_size(VDev *vdev, uint16_t queue_size) +{ + return pci_bswap16_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_Q_SIZ= E, + c_cap.bar, queue_size); +} + +static int virtio_pci_set_queue_enable(VDev *vdev, uint16_t enabled) +{ + return pci_bswap16_write(vdev->pci_fh, c_cap.off + VPCI_C_OFFSET_Q_ENA= BLE, + c_cap.bar, enabled); +} + +static int set_pci_vq_addr(VDev *vdev, uint64_t config_off, void *addr) +{ + return pci_bswap64_write(vdev->pci_fh, c_cap.off + config_off, c_cap.b= ar, + (uint64_t) addr); +} + +int virtio_pci_setup(VDev *vdev) +{ + VRing *vr; + int rc; + uint64_t pci_features; + 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; + } + + rc =3D virtio_pci_read_pci_cap_config(vdev); + if (rc) { + printf("Invalid PCI capabilities"); + return -EIO; + } + + switch (vdev->dev_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 || virtio_pci_set_gfeatures(vdev)) { + 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]; + + if (pci_read_flex(vdev->pci_fh, VPCI_C_COMMON_NUMQ, c_cap.bar, &in= fo.num, 2)) { + return -EIO; + } + + vring_init(vr, &info); + + if (virtio_pci_set_selected_vq(vdev, vr->id)) { + puts("Failed to set selected virt-queue"); + return -EIO; + } + + if (virtio_pci_set_queue_size(vdev, VIRTIO_RING_SIZE)) { + puts("Failed to set virt-queue size"); + return -EIO; + } + + rc =3D set_pci_vq_addr(vdev, VPCI_C_OFFSET_Q_DESCLO, vr->desc); + rc |=3D set_pci_vq_addr(vdev, VPCI_C_OFFSET_Q_AVAILLO, vr->avail); + rc |=3D set_pci_vq_addr(vdev, VPCI_C_OFFSET_Q_USEDLO, vr->used); + if (rc) { + puts("Failed to configure virt-queue address"); + return -EIO; + } + + if (virtio_pci_set_queue_enable(vdev, true)) { + 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) +{ + VDev *vdev =3D virtio_get_device(); + + if (enable_pci_function(&vdev->pci_fh)) { + puts("Failed to enable PCI function"); + return -ENODEV; + } + + return 0; +} + +long virtio_pci_notify(uint32_t fhandle, int vq_id) +{ + uint32_t offset =3D n_cap.off + notify_mult * q_notify_offset; + return pci_bswap16_write(fhandle, offset, n_cap.bar, (uint16_t) vq_id); +} diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 0488b3a07e..50afb11f6a 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -15,6 +15,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" @@ -109,6 +110,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; @@ -182,6 +185,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); default: return -1; } diff --git a/pc-bios/s390-ccw/Makefile b/pc-bios/s390-ccw/Makefile index a62fc9d766..3e5dfb64d5 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 Sun Feb 8 19:28:05 2026 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=1765400140; cv=none; d=zohomail.com; s=zohoarc; b=RhFQ90B2hhZybcskpmlTvyugaXh3CIp6KJK0ByMG/S/Ut2wDbj++uHvQxZcbB2040NJtLrhdWhCthj7f9uWFd8pUbTvGYlcnLU7T0phNO/tvj7jlakOvUud42bOscAFagtchl6d1wW16wZeJoVoJyWYJAlwGVNBJVRJHhtk15iA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400140; 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=qADPa9eOmA7rIYvJ/wZ4uUQmvMRlJiCga7+UAXmGwK8=; b=hdYDNM31vzjNRrB2h3vV1xSxG5E4ieq+N094Gl4oOwBck5sZkfyW0u9xsYkIDf9iTjhR9BS0IB1X1ohyYqpfW3LuxVTp05WH6bX8GR73Ocab9Lj1bkGca79KfwQwYQYQAC8zJHPgyb3X4zhs0EuWlt2D84j4xax92hc/5FdaqSs= 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 17654001407647.4445561242391705; Wed, 10 Dec 2025 12:55:40 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDN-0004jW-5a; Wed, 10 Dec 2025 15:55:13 -0500 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 1vTRDK-0004ho-Ih; Wed, 10 Dec 2025 15:55:10 -0500 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 1vTRDI-0000hw-NE; Wed, 10 Dec 2025 15:55:10 -0500 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 5BAILILL005894; Wed, 10 Dec 2025 20:55:07 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 4avc53kvsq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:07 +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 5BAKCmFe002103; Wed, 10 Dec 2025 20:55:06 GMT Received: from smtprelay05.dal12v.mail.ibm.com ([172.16.1.7]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 4aw11jjma0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:06 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay05.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 5BAKt5Kw20120316 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:55:05 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5D9C758056; Wed, 10 Dec 2025 20:55:05 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AF15B58052; Wed, 10 Dec 2025 20:55:04 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:55:04 +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=qADPa9eOmA7rIYvJ/ wZ4uUQmvMRlJiCga7+UAXmGwK8=; b=j82DVwkAsrlAX+NNb3MF2RS7Mu9ryzALu 33Ew3OiWwp1fvGkQj3fMLHnRFpCA/US6t2/lH84brRQ/AfacrkvWc5rrGHwmQHmN KcCNGU9E6+WUh85o4+WsAfA3aEA+H0hHICitWbgYbuzTEq816+auho/jP2GStO9I 2PbiCPfPhpOgRGLL8dik+s4FBRYMt3lvJoVFxTE8f60UuXJodPFsut4vi4ne7Wfn Dr176nSNmNBd27+ZnbdQtlLtcZw7zEdG43GMITrIdj3P/D2a+HgcxafhHpv2uJ4I wPkcy+7aBNqNIEAn3DZr9ScoLrfU81vXDaj72iRDRz2wvn7PYLD6Q== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 08/10] s390x: Build IPLB for virtio-pci devices Date: Wed, 10 Dec 2025 15:54:47 -0500 Message-ID: <20251210205449.2783111-9-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAyMCBTYWx0ZWRfX8JIqWcVv3VJp ldANk3U6DWgiQK3JZC0IVU6zTK3ZVt+vZ9AgE7RY3mLGuswgTtSqCZdm5rvBgZhWsFqPDIjEm2G 8hq5JExUqQn5EagcB3Ap4Pi7Sekqs3vj6TkczC194GENTs5FciEeSAS2R0KPvMdPLSXt27Cn/I4 FUY2ufEdvoL61aVHdfNdaPSSwJir2i2UNW1paJ5X2+ZU04FunOrpq72p1jzM7434MgSA70NWzc0 RwZSvmHT6L7VLf7/wtH1Ygw/OUSgXIlQJoEz+KwPkgH/zy/K+8aA6BwE3WvrTYBmW1DqBWu/wVy rV3cePlKsLeIuR6oK6uGWZpEKWkRqHM9eeoDOeG1N5yizcBMzcAPci7+s6WbRfKwUFpOLq6N6mx lGdh3lG1FBFhCPbUCrb41so4KGFuPw== X-Authority-Analysis: v=2.4 cv=S/DUAYsP c=1 sm=1 tr=0 ts=6939de2b cx=c_pps a=AfN7/Ok6k8XGzOShvHwTGQ==:117 a=AfN7/Ok6k8XGzOShvHwTGQ==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=FIndvaBErfhezouc_AYA:9 X-Proofpoint-ORIG-GUID: DiDaOiqJCxsHW2fpNqsXy-6s3KDEALEZ X-Proofpoint-GUID: DiDaOiqJCxsHW2fpNqsXy-6s3KDEALEZ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 clxscore=1015 impostorscore=0 suspectscore=0 lowpriorityscore=0 adultscore=0 spamscore=0 bulkscore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060020 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: 1765400142095158500 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). 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 f643e13057..6cbe26a0b8 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 3843d2a850..cf423ac764 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" @@ -339,7 +341,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 @@ -348,7 +351,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 *) @@ -395,6 +398,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(); @@ -427,14 +455,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; @@ -484,6 +510,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 Sun Feb 8 19:28:05 2026 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=1765400227; cv=none; d=zohomail.com; s=zohoarc; b=EGkkDIbEjCE3Mrxffngq6t8lOLXgdGidWra+tqkIjZw+PH+rJ/JFJPZsPEdKDYHfQn3YFZwfA9RgiXlQlBpx55hfuhRrfbFficXCcLsrobuomI7fMidpK5MOoWhlVtt9Kjt3V1bg+5JZG/2NGbWl3wszH5cG90QsTgWn9Re7Z7U= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400227; 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=CBtmBBLLfTNE/9f796wDBJIpSmXUfFmfJQHxNvnhsmc=; b=QfbnNrKCBEucK0Y3ucNO3zqniaaAPXMRw0HbhiLSOH+GYBpGd380mpwzHTv6E4+/ZFw0dfTs/S2ZDhQOLEO/H8iinSAyjyAwZOm3ggXQac7m4TtaQX0E20k4sSJ58fgCmboElkB9EaKf5LBKfaQnS05EL2chQ9gR6b2midAZkRk= 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 1765400227584994.6494901897215; Wed, 10 Dec 2025 12:57:07 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDO-0004ka-W8; Wed, 10 Dec 2025 15:55:15 -0500 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 1vTRDM-0004iE-2V; Wed, 10 Dec 2025 15:55:12 -0500 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 1vTRDK-0000iR-Do; Wed, 10 Dec 2025 15:55:11 -0500 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 5BACm22i018045; Wed, 10 Dec 2025 20:55:09 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 4avawvc09h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:08 +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 5BAK8adl012443; Wed, 10 Dec 2025 20:55:08 GMT Received: from smtprelay06.dal12v.mail.ibm.com ([172.16.1.8]) by ppma23.wdc07v.mail.ibm.com (PPS) with ESMTPS id 4aw0ak2r29-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:08 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay06.dal12v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 5BAKt6ia16843408 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:55:07 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E043758056; Wed, 10 Dec 2025 20:55:06 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3DB7158052; Wed, 10 Dec 2025 20:55:06 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:55:06 +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=CBtmBBLLfTNE/9f79 6wDBJIpSmXUfFmfJQHxNvnhsmc=; b=cJp1IzljWVLWU2q46/mizDx2Qe6bKCPVJ LcIDlS35gcRV8WXVJwuZNZho3r8pbw/YvczSeV+Hn6zRJj/kInXV2MF3QPpmgJlW 2yJdlVSvieHwDSV0gNkkCd2dJdqptLjqJ77JV7WAR+gYF3YApPxYCbUMV1oIitt7 qw94WLrzc6PaTxIIVgdQZ4f7LfdCv2/N9eAp5iy2UT6NF7PPT06/dHVPc62UnMU8 +un5HFn5iUMObMcaJ2o35cLebV9W0OAOdGwjpn2oK4UAmRQFR8Ext74QJHJqnX6x ymtvu7k/kKJuDeq4/6hY2wR1KugLmg7biJBylS5pKSe/7Q+8hd4eQ== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 09/10] hw: Add "loadparm" property to PCI devices for booting on s390x Date: Wed, 10 Dec 2025 15:54:48 -0500 Message-ID: <20251210205449.2783111-10-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: h2E3c_Q3lrS8mjCKn9j8dRGnHbgqOId1 X-Proofpoint-ORIG-GUID: h2E3c_Q3lrS8mjCKn9j8dRGnHbgqOId1 X-Authority-Analysis: v=2.4 cv=aY9sXBot c=1 sm=1 tr=0 ts=6939de2c cx=c_pps a=3Bg1Hr4SwmMryq2xdFQyZA==:117 a=3Bg1Hr4SwmMryq2xdFQyZA==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=vmHGOmvCPtFvCN_kkgEA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAwNyBTYWx0ZWRfX6swBB76UubV2 OyUSdXJ5CTavTbJgM+t6kFDOnlad3me3JDxTQGIfwNIbDW5dfcLzBn1uf/GxAAMhQcsOS7jtu/4 nmn4d3zQMHLOSxUTsCD2QCKCpL5XOu0Cq0dnfxL6AciHg23o9kfSj1nG0Tlt61CtBXyk7hWTQiW HLKDrZgzOs4HOqbB0xaNh6CBrJb/tiSbykN9VMckp6vAGGF51C00joRgUTVlztkAXioIzjTOzKr zM+PuY8s88COGe1RecmTb3RtChGuur3yVhAeTwamvlzZJpEzsGwYyzt7iJVJIjkhwVccRATTlNz rUIv0WJrqrqTHmmtRqFKxk0ijUD+R7mCgnGSqYNVZ+W+Izd7BTs2B7WmryTXjv/ba2YeBb6WwZ3 nMkQ6Ku1g/v0MiU+67xHG5EWByH9JQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1015 phishscore=0 lowpriorityscore=0 bulkscore=0 adultscore=0 impostorscore=0 malwarescore=0 priorityscore=1501 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060007 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: 1765400228071158500 Content-Type: text/plain; charset="utf-8" From: Jared Rossi The loadparm is required on s390x to pass the information to the boot loader such as which kernel should be started or whether the boot menu should be s= hown. Because PCI devices do not naturally allocate space for this, the property = is added on an architecture specific basis. Signed-off-by: Jared Rossi --- include/hw/pci/pci_device.h | 3 +++ hw/pci/pci.c | 39 +++++++++++++++++++++++++++++++++++++ hw/s390x/ipl.c | 11 +++++++++-- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/include/hw/pci/pci_device.h b/include/hw/pci/pci_device.h index 88ccea5011..5cac6e1688 100644 --- a/include/hw/pci/pci_device.h +++ b/include/hw/pci/pci_device.h @@ -62,6 +62,9 @@ struct PCIDevice { bool partially_hotplugged; bool enabled; =20 + /* only for s390x */ + char *loadparm; + /* PCI config space */ uint8_t *config; =20 diff --git a/hw/pci/pci.c b/hw/pci/pci.c index b1eba348e0..1ea0d7c54c 100644 --- a/hw/pci/pci.c +++ b/hw/pci/pci.c @@ -36,6 +36,7 @@ #include "migration/qemu-file-types.h" #include "migration/vmstate.h" #include "net/net.h" +#include "system/arch_init.h" #include "system/numa.h" #include "system/runstate.h" #include "system/system.h" @@ -2825,6 +2826,43 @@ int pci_qdev_find_device(const char *id, PCIDevice *= *pdev) return rc; } =20 +static char *pci_qdev_property_get_loadparm(Object *obj, Error **errp) +{ + return g_strdup(PCI_DEVICE(obj)->loadparm); +} + +static void pci_qdev_property_set_loadparm(Object *obj, const char *value, + Error **errp) +{ + void *lp_str; + + if (object_property_get_int(obj, "bootindex", NULL) < 0) { + error_setg(errp, "'loadparm' is only valid for boot devices"); + return; + } + + lp_str =3D g_malloc0(strlen(value) + 1); + if (!qdev_prop_sanitize_s390x_loadparm(lp_str, value, errp)) { + g_free(lp_str); + return; + } + PCI_DEVICE(obj)->loadparm =3D lp_str; +} + +static void pci_qdev_property_add_specifics(DeviceClass *dc) +{ + ObjectClass *oc =3D OBJECT_CLASS(dc); + + /* The loadparm property is only supported on s390x */ + if (qemu_arch_available(QEMU_ARCH_S390X)) { + object_class_property_add_str(oc, "loadparm", + pci_qdev_property_get_loadparm, + pci_qdev_property_set_loadparm); + object_class_property_set_description(oc, "loadparm", + "load parameter (s390x only)= "); + } +} + MemoryRegion *pci_address_space(PCIDevice *dev) { return pci_get_bus(dev)->address_space_mem; @@ -2843,6 +2881,7 @@ static void pci_device_class_init(ObjectClass *klass,= const void *data) k->unrealize =3D pci_qdev_unrealize; k->bus_type =3D TYPE_PCI_BUS; device_class_set_props(k, pci_props); + pci_qdev_property_add_specifics(k); object_class_property_set_description( klass, "x-max-bounce-buffer-size", "Maximum buffer size allocated for bounce buffers used for mapped " diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c index cf423ac764..57f5a7a204 100644 --- a/hw/s390x/ipl.c +++ b/hw/s390x/ipl.c @@ -460,6 +460,7 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPar= ameterBlock *iplb) int devtype; uint8_t *lp; g_autofree void *scsi_lp =3D NULL; + g_autofree void *pci_lp =3D NULL; =20 ccw_dev =3D s390_get_ccw_device(dev_st, &devtype); if (ccw_dev) { @@ -512,6 +513,14 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPa= rameterBlock *iplb) =20 pbdev =3D s390_get_pci_device(dev_st, &devtype); if (pbdev) { + pci_lp =3D object_property_get_str(OBJECT(pbdev->pdev), "loadparm"= , NULL); + if (pci_lp && strlen(pci_lp) > 0) { + lp =3D pci_lp; + } else { + /* Use machine loadparm as a place holder if PCI LP is unset */ + lp =3D S390_CCW_MACHINE(qdev_get_machine())->loadparm; + } + switch (devtype) { case PCI_DEVTYPE_VIRTIO: iplb->len =3D S390_IPLB_MIN_PCI_LEN; @@ -522,8 +531,6 @@ static bool s390_build_iplb(DeviceState *dev_st, IplPar= ameterBlock *iplb) return false; } =20 - /* 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; =20 --=20 2.49.0 From nobody Sun Feb 8 19:28:05 2026 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=1765400175; cv=none; d=zohomail.com; s=zohoarc; b=FSAzlDE12dFCMp3y+ThFCuwVk/H44+30otY95+YPXv8VOGnbdWxh5mad2eb5EG6pL7/ziGQLftqxCs6ysQTvCx48dFJVDnHaCh5o29ZgjNbfp6QM977nRs8jTpc9O7kjx+OzlTiy1gh3ErkBkIEMZjQShxoiQE2zV96sRafacKA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1765400175; 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=mYK6ANKllIGi2j6SaH3K+ynCp5G4i8ZfWx+h207BRoo=; b=OOydMrdK/N0cGTM7u3+6SMZCSQQ1h+MbxuhpJmEfxhs3BxXAwQy18OqdyiFpxUunHBUiSzBvN2LuTXtpbPyLvQ+juaRMheDQwe/MJ0DUVmjRdCD1Gaj3n8q+0LCyN+mRVk2uk+0xi5qiCS5nK6wZWW9i8VS0bBvCUuwx4BrfG24= 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 176540017572051.853248836856324; Wed, 10 Dec 2025 12:56:15 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vTRDd-0004mL-TO; Wed, 10 Dec 2025 15:55:31 -0500 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 1vTRDQ-0004ko-1c; Wed, 10 Dec 2025 15:55:16 -0500 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 1vTRDO-0000jH-BM; Wed, 10 Dec 2025 15:55:15 -0500 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 5BAEcwIM022803; Wed, 10 Dec 2025 20:55:12 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 4avc61mjeh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:12 +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 5BAKqAIS026836; Wed, 10 Dec 2025 20:55:11 GMT Received: from smtprelay02.wdc07v.mail.ibm.com ([172.16.1.69]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 4aw1h1ag0s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 10 Dec 2025 20:55:11 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay02.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 5BAKt9Sv23527994 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 10 Dec 2025 20:55:10 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B1EC258069; Wed, 10 Dec 2025 20:55:09 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0B23058056; Wed, 10 Dec 2025 20:55:09 +0000 (GMT) Received: from t15.ibmuc.com (unknown [9.61.53.32]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Wed, 10 Dec 2025 20:55:08 +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=mYK6ANKllIGi2j6Sa H3K+ynCp5G4i8ZfWx+h207BRoo=; b=Qq3fgGwoxaCiD4MXLuConQzhiuTWHbAok pxO1T3EB/s6rjyOD89YzLm+UwdQvWGTfc5F3JGs6x/1S+e90McocKjj9rLktPjF7 kr//V272vqCRjValGhSXbJmYaOJ+kqlUkUvvNURYubXdfbX47AvK3T44whVFiG1s xMe+pV5GrAs7keur2tFOBMYhFfKSfe9cMg8/3Ndjyk76n3TbKeMqkel0gGD7LJKh zaSeAAmWiPaEaqxYFqSoZyh/vWk1hM4tbaRuDUPcBRMXyc80Qqj+JvTfzHxMvml8 o15eiVyxsU85qy1zkGxVinIei3ZZ3uDSvkv6chPQYQ2Ympgsc5gJQ== From: jrossi@linux.ibm.com To: qemu-devel@nongnu.org, qemu-s390x@nongnu.org, thuth@redhat.com, mst@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 10/10] tests/qtest: Add s390x PCI boot test to cdrom-test.c Date: Wed, 10 Dec 2025 15:54:49 -0500 Message-ID: <20251210205449.2783111-11-jrossi@linux.ibm.com> X-Mailer: git-send-email 2.43.5 In-Reply-To: <20251210205449.2783111-1-jrossi@linux.ibm.com> References: <20251210205449.2783111-1-jrossi@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMjA2MDAyMCBTYWx0ZWRfXwcRiamUgk/Na Lf9QIb5y+p9N7bNbW62sB3QxEb5sCZY3Xf5EX+Y9QUgQGoCsRwdWBm0A9GBVQX937ZTTu7foBPk WbPx4lc9J6SEfQ2CEM+DPQ3YK+qjJ/CMUw9PQmjdMuq3uJdAtUPZx4xtnC9cM6Jt2ldZZdCCVMH ZUf1SzyFeYsUFB31cCeEN+aMD1rwhM2Kr6NsWqFZtpNXmYrMCP/qamu20E0Rk2DNgTq1hCamjBw Tlhr2R0jJLFdGs6m+ztF0/TgKQ715VVHwBGUhcHze8tckxJTJaLzrbxww26LSApybMEbCTiHGUx B8b4/o9HvlNmJh0c4zdFdF2M1g68Wyw1OHSjlhKZLGkdyxUWYS7r35DHlS6qaBh++j+u+XCg+3a 4Uhw3HTNOZUfRzfKBLjf1V5kK3jHQA== X-Proofpoint-GUID: AiCgjsqtVmTNiHD9eMtBXFlD2bdT0noN X-Proofpoint-ORIG-GUID: AiCgjsqtVmTNiHD9eMtBXFlD2bdT0noN X-Authority-Analysis: v=2.4 cv=O/U0fR9W c=1 sm=1 tr=0 ts=6939de30 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=wP3pNCr1ah4A:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=20KFwNOVAAAA: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.100.49 definitions=2025-12-10_03,2025-12-09_03,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 phishscore=0 suspectscore=0 adultscore=0 spamscore=0 malwarescore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510240000 definitions=main-2512060020 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: 1765400177752158500 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. Reviewed-by: Thomas Huth Signed-off-by: Jared Rossi --- 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