From patchwork Wed Jan 12 11:55:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711330 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 953DAC433EF for ; Wed, 12 Jan 2022 12:28:58 +0000 (UTC) Received: from localhost ([::1]:45204 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7ckL-0006aN-CV for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:28:57 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60666) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEx-0006Uo-5b; Wed, 12 Jan 2022 06:56:31 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:52062) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEp-0007Va-0l; Wed, 12 Jan 2022 06:56:30 -0500 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAuVUS006870; Wed, 12 Jan 2022 11:56:19 GMT Received: from ppma02fra.de.ibm.com (47.49.7a9f.ip4.static.sl-reverse.com [159.122.73.71]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhwp723eb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:16 +0000 Received: from pps.filterd (ppma02fra.de.ibm.com [127.0.0.1]) by ppma02fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmELv022276; Wed, 12 Jan 2022 11:56:13 GMT Received: from b06avi18878370.portsmouth.uk.ibm.com (b06avi18878370.portsmouth.uk.ibm.com [9.149.26.194]) by ppma02fra.de.ibm.com with ESMTP id 3df28a915s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:11 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBu3Ox47382810 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:03 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9A3A411C05B; Wed, 12 Jan 2022 11:56:03 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2484E11C07A; Wed, 12 Jan 2022 11:56:03 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:03 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 392F02201C6; Wed, 12 Jan 2022 12:56:02 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 01/34] pseries: Update SLOF firmware image Date: Wed, 12 Jan 2022 12:55:18 +0100 Message-Id: <20220112115551.987666-2-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> X-TM-AS-GCONF: 00 X-Proofpoint-GUID: Tb4_kQKEJl_hpHJPfCIbiXu72vT3y4Yx X-Proofpoint-ORIG-GUID: Tb4_kQKEJl_hpHJPfCIbiXu72vT3y4Yx X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 clxscore=1034 priorityscore=1501 malwarescore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 mlxscore=0 mlxlogscore=999 spamscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, HTML_SINGLET_MANY=0.001, LOTS_OF_MONEY=0.001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Alexey Kardashevskiy , Peter Maydell , Richard Henderson Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Alexey Kardashevskiy The only change is that SLOF is compiled with -mcpu=power5 to make it work on PPC970 too. Signed-off-by: Alexey Kardashevskiy --- pc-bios/README | 2 +- pc-bios/slof.bin | Bin 991920 -> 992384 bytes roms/SLOF | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pc-bios/README b/pc-bios/README index c51ae58824a9..ba6c15e76957 100644 --- a/pc-bios/README +++ b/pc-bios/README @@ -14,7 +14,7 @@ - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware implementation for certain IBM POWER hardware. The sources are at https://github.com/aik/SLOF, and the image currently in qemu is - built from git tag qemu-slof-20211112. + built from git tag qemu-slof-20220110. - VOF (Virtual Open Firmware) is a minimalistic firmware to work with -machine pseries,x-vof=on. When enabled, the firmware acts as a slim shim and diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin index 046ca63709aacf7f05c9b95a37535ac2c0b52df3..cbbe23e9107575c64c3264badacfad8b0a7ca090 100644 GIT binary patch delta 267695 zcmeFa3v^UPwl`jNI*<+qXtaRCixU+MUj$10i(Mph1WziZm}Fj5=XN?T~Ix zCx8;gnP3JAMueb%;HVQuGBOGpd>}YF7ajG(kw*}ag!qV#kAwi{|J!xCL!!>yx&OPq zweI@X&03w)ryjd@?b>_Su3fvTYu-!`9!akp-#0P1sA$>nar4H`A2)aYg82)^ja$0# z?)y@!;`zX?mIQ9IOm#h7nZ z$4dRLXPs+_#Ws;T!!irc?8M8##Z6-b|_X$=*AW}p8*eKIq=#=h8`g@e_#>b<5R~6?O#939QXQV{?lFKkCN$X{=W(M@o zQd*O%_D@N+QMUd3#ba*PWxa&;B&b)eQ_#Mnb+LU_Yq5QPE8+2Bm1%0AX9yRxvlwZ4 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 ~k;8br+r}fCe9r!X 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 delta 267618 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 y$A8x&J1W!j|L5G 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

5sR_6e5!(A5f1`q^fbMat8lH~A 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

V#wuXNDFvdA+fx5 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 diff --git a/roms/SLOF b/roms/SLOF index a6906b024c6c..5b4c5acdcd55 160000 --- a/roms/SLOF +++ b/roms/SLOF @@ -1 +1 @@ -Subproject commit a6906b024c6cca5a86496f51eb4bfee3a0c36148 +Subproject commit 5b4c5acdcd552a4e1796aeca6bb700f6cbb0282d From patchwork Wed Jan 12 11:55:19 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711336 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DA84AC433F5 for ; Wed, 12 Jan 2022 12:35:23 +0000 (UTC) Received: from localhost ([::1]:54790 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cqY-00063o-Sw for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:35:22 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60542) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEr-0006Tc-C6; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:40618) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEn-0007V6-Pa; Wed, 12 Jan 2022 06:56:24 -0500 Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBLFfZ016743; Wed, 12 Jan 2022 11:56:09 GMT Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhac0kfgh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:08 +0000 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmHkZ022851; Wed, 12 Jan 2022 11:56:07 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma03fra.de.ibm.com with ESMTP id 3df289h0r1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:06 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBu4Rp48497062 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:04 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 12077A4E61; Wed, 12 Jan 2022 11:56:04 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CB739A4E6E; Wed, 12 Jan 2022 11:56:03 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:03 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 13F1A22016C; Wed, 12 Jan 2022 12:56:03 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 02/34] target/ppc: Add popcntb instruction to POWER5+ processors Date: Wed, 12 Jan 2022 12:55:19 +0100 Message-Id: <20220112115551.987666-3-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: Dz5qAOH5nMhT8OQT9SBzCofk_sS1XTJt X-Proofpoint-ORIG-GUID: Dz5qAOH5nMhT8OQT9SBzCofk_sS1XTJt X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1034 adultscore=0 priorityscore=1501 mlxscore=0 spamscore=0 malwarescore=0 bulkscore=0 phishscore=0 lowpriorityscore=0 mlxlogscore=962 suspectscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" popcntb instruction was added in ISA v2.02. Add support for POWER5+ processors since they implement ISA v2.03. PPC970 CPUs implement v2.01 and do not support popcntb. Signed-off-by: Cédric Le Goater Reviewed-by: Fabiano Rosas Message-Id: <20220105095142.3990430-2-clg@kaod.org> Signed-off-by: Cédric Le Goater --- target/ppc/cpu_init.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c index cc93bff3fac4..f15a52259c90 100644 --- a/target/ppc/cpu_init.c +++ b/target/ppc/cpu_init.c @@ -6957,6 +6957,7 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data) PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | PPC_64B | + PPC_POPCNTB | PPC_SEGMENT_64B | PPC_SLBI; pcc->insns_flags2 = PPC2_FP_CVT_S64; pcc->msr_mask = (1ull << MSR_SF) | From patchwork Wed Jan 12 11:55:20 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711326 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7D2EBC433EF for ; Wed, 12 Jan 2022 12:23:49 +0000 (UTC) Received: from localhost ([::1]:34712 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cfM-0007fd-IV for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:23:48 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60546) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEr-0006Td-FV; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:2926) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEn-0007Uy-Ny; Wed, 12 Jan 2022 06:56:25 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBPFT4013867; Wed, 12 Jan 2022 11:56:10 GMT Received: from ppma05fra.de.ibm.com (6c.4a.5195.ip4.static.sl-reverse.com [149.81.74.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhv9qvd8a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:10 +0000 Received: from pps.filterd (ppma05fra.de.ibm.com [127.0.0.1]) by ppma05fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmRMO031223; Wed, 12 Jan 2022 11:56:07 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma05fra.de.ibm.com with ESMTP id 3df289h2mb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:07 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBl1CA33817054 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:47:01 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AF31511C076; Wed, 12 Jan 2022 11:56:04 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 74FCA11C05B; Wed, 12 Jan 2022 11:56:04 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:04 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id BB5D72201C6; Wed, 12 Jan 2022 12:56:03 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 03/34] spapr: Fix support of POWER5+ processors Date: Wed, 12 Jan 2022 12:55:20 +0100 Message-Id: <20220112115551.987666-4-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 15hBKi9zZaASixTUNCnkUYh0r-Yq1lJp X-Proofpoint-ORIG-GUID: 15hBKi9zZaASixTUNCnkUYh0r-Yq1lJp X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 phishscore=0 clxscore=1034 suspectscore=0 malwarescore=0 priorityscore=1501 mlxlogscore=825 mlxscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" POWER5+ (ISA v2.03) processors are supported by the pseries machine but they do not have Altivec instructions. Do not advertise support for it in the DT. To be noted that this test is in contradiction with the assert in cap_vsx_apply(). Signed-off-by: Cédric Le Goater Tested-by: Fabiano Rosas Message-Id: <20220105095142.3990430-3-clg@kaod.org> Signed-off-by: Cédric Le Goater --- hw/ppc/spapr.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 837342932586..72f5dce751ee 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -723,10 +723,12 @@ static void spapr_dt_cpu(CPUState *cs, void *fdt, int offset, * * Only CPUs for which we create core types in spapr_cpu_core.c * are possible, and all of those have VMX */ - if (spapr_get_cap(spapr, SPAPR_CAP_VSX) != 0) { - _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 2))); - } else { - _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 1))); + if (env->insns_flags & PPC_ALTIVEC) { + if (spapr_get_cap(spapr, SPAPR_CAP_VSX) != 0) { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 2))); + } else { + _FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 1))); + } } /* Advertise DFP (Decimal Floating Point) if available From patchwork Wed Jan 12 11:55:21 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711355 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DED20C433EF for ; Wed, 12 Jan 2022 12:49:51 +0000 (UTC) Received: from localhost ([::1]:35462 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7d4X-0004gQ-P0 for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:49:50 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60548) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEr-0006Te-Ga; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:42452 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEn-0007Uo-Na; Wed, 12 Jan 2022 06:56:23 -0500 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CApXYw009724; Wed, 12 Jan 2022 11:56:09 GMT Received: from ppma04fra.de.ibm.com (6a.4a.5195.ip4.static.sl-reverse.com [149.81.74.106]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhwkut9gh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:09 +0000 Received: from pps.filterd (ppma04fra.de.ibm.com [127.0.0.1]) by ppma04fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmIFW018120; Wed, 12 Jan 2022 11:56:07 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma04fra.de.ibm.com with ESMTP id 3df289s1yu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:07 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBu5Xv42664350 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:05 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 4788E11C09B; Wed, 12 Jan 2022 11:56:05 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 165FD11C08B; Wed, 12 Jan 2022 11:56:05 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:05 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 6484C22016C; Wed, 12 Jan 2022 12:56:04 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 04/34] target/ppc: Add extra float instructions to POWER5P processors Date: Wed, 12 Jan 2022 12:55:21 +0100 Message-Id: <20220112115551.987666-5-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: HzQm0kC7K4X5R2zbim0vCOwInvhF-2ub X-Proofpoint-GUID: HzQm0kC7K4X5R2zbim0vCOwInvhF-2ub X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1034 phishscore=0 bulkscore=0 priorityscore=1501 adultscore=0 spamscore=0 mlxlogscore=937 lowpriorityscore=0 impostorscore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" ISA v2.03 introduced Floating Round to Integer instructions : frin, friz, frip, and frim. Add them to POWER5+. The PPC_FLOAT_EXT flag also includes the fre (Floating Reciprocal Estimate) instruction which was introduced in ISA v2.0x. The architecture document says its optional and that might be the reason why it has been kept under the PPC_FLOAT_EXT flag. This means 970 CPUs can not use it under QEMU, which doesn't seem to be a problem. Signed-off-by: Cédric Le Goater --- target/ppc/cpu_init.c | 1 + 1 file changed, 1 insertion(+) diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c index f15a52259c90..e30e86fe9d04 100644 --- a/target/ppc/cpu_init.c +++ b/target/ppc/cpu_init.c @@ -6953,6 +6953,7 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data) PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES | PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | PPC_FLOAT_STFIWX | + PPC_FLOAT_EXT | PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ | PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE | PPC_MEM_TLBSYNC | From patchwork Wed Jan 12 11:55:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711323 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 2F79DC433F5 for ; Wed, 12 Jan 2022 12:19:13 +0000 (UTC) Received: from localhost ([::1]:54512 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cau-0001f5-AY for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:19:12 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60520) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEq-0006TZ-IK; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:29718 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEn-0007V0-Ny; Wed, 12 Jan 2022 06:56:24 -0500 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CApUed009571; Wed, 12 Jan 2022 11:56:12 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhwkut9kh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:12 +0000 Received: from m0098414.ppops.net (m0098414.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBh2Yt005616; Wed, 12 Jan 2022 11:56:11 GMT Received: from ppma01fra.de.ibm.com (46.49.7a9f.ip4.static.sl-reverse.com [159.122.73.70]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhwkut9hq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:11 +0000 Received: from pps.filterd (ppma01fra.de.ibm.com [127.0.0.1]) by ppma01fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBlqad025221; Wed, 12 Jan 2022 11:56:09 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma01fra.de.ibm.com with ESMTP id 3dfwhjc6eb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:08 +0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBu6jT28115380 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:06 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1D428AE057; Wed, 12 Jan 2022 11:56:06 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C425FAE045; Wed, 12 Jan 2022 11:56:05 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av26.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:05 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 06D642201C6; Wed, 12 Jan 2022 12:56:04 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 05/34] docs/system/ppc: Merge the PEF information into the pseries page Date: Wed, 12 Jan 2022 12:55:22 +0100 Message-Id: <20220112115551.987666-6-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: EUFD6AUOCRDgP3DZi3hcUr7yeapKtjSt X-Proofpoint-GUID: OSTUQyW6ZGZWpPVdcqJLu_ICQ-HWXYFZ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1034 phishscore=0 bulkscore=0 priorityscore=1501 adultscore=0 spamscore=0 mlxlogscore=940 lowpriorityscore=0 impostorscore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Thomas Huth , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Thomas Huth The Protected Execution Facility is only available with the pseries machine, so let's merge the old ASCII text into the new RST file now. Signed-off-by: Thomas Huth Reviewed-by: Daniel Henrique Barboza Message-Id: <20220105103232.405204-1-thuth@redhat.com> Signed-off-by: Cédric Le Goater --- docs/papr-pef.txt | 30 ------------------------------ docs/system/ppc/pseries.rst | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 30 deletions(-) delete mode 100644 docs/papr-pef.txt diff --git a/docs/papr-pef.txt b/docs/papr-pef.txt deleted file mode 100644 index 72550e9bf896..000000000000 --- a/docs/papr-pef.txt +++ /dev/null @@ -1,30 +0,0 @@ -POWER (PAPR) Protected Execution Facility (PEF) -=============================================== - -Protected Execution Facility (PEF), also known as Secure Guest support -is a feature found on IBM POWER9 and POWER10 processors. - -If a suitable firmware including an Ultravisor is installed, it adds -an extra memory protection mode to the CPU. The ultravisor manages a -pool of secure memory which cannot be accessed by the hypervisor. - -When this feature is enabled in QEMU, a guest can use ultracalls to -enter "secure mode". This transfers most of its memory to secure -memory, where it cannot be eavesdropped by a compromised hypervisor. - -Launching ---------- - -To launch a guest which will be permitted to enter PEF secure mode: - -# ${QEMU} \ - -object pef-guest,id=pef0 \ - -machine confidential-guest-support=pef0 \ - ... - -Live Migration ----------------- - -Live migration is not yet implemented for PEF guests. For -consistency, we currently prevent migration if the PEF feature is -enabled, whether or not the guest has actually entered secure mode. diff --git a/docs/system/ppc/pseries.rst b/docs/system/ppc/pseries.rst index 72e315eff628..16394fa5218b 100644 --- a/docs/system/ppc/pseries.rst +++ b/docs/system/ppc/pseries.rst @@ -230,6 +230,39 @@ nested. Combinations not shown in the table are not available. .. [3] Introduced on Power10 machines. + +POWER (PAPR) Protected Execution Facility (PEF) +----------------------------------------------- + +Protected Execution Facility (PEF), also known as Secure Guest support +is a feature found on IBM POWER9 and POWER10 processors. + +If a suitable firmware including an Ultravisor is installed, it adds +an extra memory protection mode to the CPU. The ultravisor manages a +pool of secure memory which cannot be accessed by the hypervisor. + +When this feature is enabled in QEMU, a guest can use ultracalls to +enter "secure mode". This transfers most of its memory to secure +memory, where it cannot be eavesdropped by a compromised hypervisor. + +Launching +^^^^^^^^^ + +To launch a guest which will be permitted to enter PEF secure mode:: + + $ qemu-system-ppc64 \ + -object pef-guest,id=pef0 \ + -machine confidential-guest-support=pef0 \ + ... + +Live Migration +^^^^^^^^^^^^^^ + +Live migration is not yet implemented for PEF guests. For +consistency, QEMU currently prevents migration if the PEF feature is +enabled, whether or not the guest has actually entered secure mode. + + Maintainer contact information ------------------------------ From patchwork Wed Jan 12 11:55:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711430 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 19DA1C433EF for ; Wed, 12 Jan 2022 14:02:37 +0000 (UTC) Received: from localhost ([::1]:45026 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7eCq-00047b-Sl for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 09:02:31 -0500 Received: from eggs.gnu.org ([209.51.188.92]:35852) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cYH-0007AL-3E; Wed, 12 Jan 2022 07:16:32 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:17982 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cYC-0002v8-IB; Wed, 12 Jan 2022 07:16:27 -0500 Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBVimW002444; Wed, 12 Jan 2022 12:16:08 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dht3ffvdr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 12:16:08 +0000 Received: from m0098420.ppops.net (m0098420.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBvo6q031750; Wed, 12 Jan 2022 12:16:07 GMT Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dht3ffvcm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 12:16:07 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CCC0TL025923; Wed, 12 Jan 2022 12:16:05 GMT Received: from b06avi18878370.portsmouth.uk.ibm.com (b06avi18878370.portsmouth.uk.ibm.com [9.149.26.194]) by ppma06ams.nl.ibm.com with ESMTP id 3df1vjbbsu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 12:16:05 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CCG2rh29426004 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 12:16:03 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D7424A4E7D; Wed, 12 Jan 2022 11:56:06 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8C96AA4E6F; Wed, 12 Jan 2022 11:56:06 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:06 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id B4A9322016C; Wed, 12 Jan 2022 12:56:05 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 06/34] MAINTAINERS: Improve the PowerPC machines section Date: Wed, 12 Jan 2022 12:55:23 +0100 Message-Id: <20220112115551.987666-7-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: lCtw3Iv-DrS13rCodXvDf6-MxNWycTLi X-Proofpoint-ORIG-GUID: pQcKPv3eBeJnGGmhzv9Kp5X1wMXnUrQC X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=823 phishscore=0 spamscore=0 clxscore=1034 suspectscore=0 bulkscore=0 malwarescore=0 mlxscore=0 priorityscore=1501 impostorscore=0 adultscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120079 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Thomas Huth , Mark Cave-Ayland , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Thomas Huth Add some documentation files to the corresponding machine sections and mention the machine names in the section titles where it is not so obvious (e.g. that "taihu" is a 405 machine). Signed-off-by: Thomas Huth Reviewed-by: Daniel Henrique Barboza Reviewed-by: Mark Cave-Ayland Message-Id: <20220105104800.407570-1-thuth@redhat.com> Signed-off-by: Cédric Le Goater --- MAINTAINERS | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index c98a61caeeed..6ccdec7f0207 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -1245,7 +1245,7 @@ F: hw/openrisc/openrisc_sim.c PowerPC Machines ---------------- -405 +405 (ref405ep and taihu) L: qemu-ppc@nongnu.org S: Orphan F: hw/ppc/ppc405_boards.c @@ -1281,6 +1281,7 @@ New World (mac99) M: Mark Cave-Ayland L: qemu-ppc@nongnu.org S: Odd Fixes +F: docs/system/ppc/powermac.rst F: hw/ppc/mac_newworld.c F: hw/pci-host/uninorth.c F: hw/pci-bridge/dec.[hc] @@ -1299,6 +1300,7 @@ Old World (g3beige) M: Mark Cave-Ayland L: qemu-ppc@nongnu.org S: Odd Fixes +F: docs/system/ppc/powermac.rst F: hw/ppc/mac_oldworld.c F: hw/pci-host/grackle.c F: hw/misc/macio/ @@ -1312,6 +1314,7 @@ PReP M: Hervé Poussineau L: qemu-ppc@nongnu.org S: Maintained +F: docs/system/ppc/prep.rst F: hw/ppc/prep.c F: hw/ppc/prep_systemio.c F: hw/ppc/rs6000_mc.c @@ -1324,7 +1327,7 @@ F: include/hw/isa/pc87312.h F: include/hw/rtc/m48t59.h F: tests/avocado/ppc_prep_40p.py -sPAPR +sPAPR (pseries) M: Cédric Le Goater M: Daniel Henrique Barboza R: David Gibson @@ -1336,8 +1339,8 @@ F: include/hw/*/spapr* F: hw/*/xics* F: include/hw/*/xics* F: pc-bios/slof.bin -F: docs/specs/ppc-spapr-hcalls.txt -F: docs/specs/ppc-spapr-hotplug.txt +F: docs/system/ppc/pseries.rst +F: docs/specs/ppc-spapr-* F: tests/qtest/spapr* F: tests/qtest/libqos/*spapr* F: tests/qtest/rtas* @@ -1348,6 +1351,7 @@ PowerNV (Non-Virtualized) M: Cédric Le Goater L: qemu-ppc@nongnu.org S: Maintained +F: docs/system/ppc/powernv.rst F: hw/ppc/pnv* F: hw/intc/pnv* F: hw/intc/xics_pnv.c From patchwork Wed Jan 12 11:55:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711352 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 69111C433EF for ; Wed, 12 Jan 2022 12:44:39 +0000 (UTC) Received: from localhost ([::1]:60026 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7czW-0001kw-0w for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:44:38 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60646) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEw-0006To-EA; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:20112) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEn-0007V8-OZ; Wed, 12 Jan 2022 06:56:30 -0500 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAuV37006856; Wed, 12 Jan 2022 11:56:13 GMT Received: from ppma03ams.nl.ibm.com (62.31.33a9.ip4.static.sl-reverse.com [169.51.49.98]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhwp723c5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:13 +0000 Received: from pps.filterd (ppma03ams.nl.ibm.com [127.0.0.1]) by ppma03ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmJB9027661; Wed, 12 Jan 2022 11:56:10 GMT Received: from b06cxnps4074.portsmouth.uk.ibm.com (d06relay11.portsmouth.uk.ibm.com [9.149.109.196]) by ppma03ams.nl.ibm.com with ESMTP id 3df289tmfg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:10 +0000 Received: from d06av24.portsmouth.uk.ibm.com (d06av24.portsmouth.uk.ibm.com [9.149.105.60]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBu7me40370592 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:07 GMT Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 788534207E; Wed, 12 Jan 2022 11:56:07 +0000 (GMT) Received: from d06av24.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 35C524207D; Wed, 12 Jan 2022 11:56:07 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av24.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:07 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 7D1BE2201C6; Wed, 12 Jan 2022 12:56:06 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 07/34] docs: Clarifications and formatting changes in ppc docs. Date: Wed, 12 Jan 2022 12:55:24 +0100 Message-Id: <20220112115551.987666-8-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> X-TM-AS-GCONF: 00 X-Proofpoint-GUID: m6gGAhl98ZQbbHfvRJb8o01S0qhwlFV8 X-Proofpoint-ORIG-GUID: m6gGAhl98ZQbbHfvRJb8o01S0qhwlFV8 X-Proofpoint-UnRewURL: 0 URL was un-rewritten MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 clxscore=1034 priorityscore=1501 malwarescore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 mlxscore=0 mlxlogscore=999 spamscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_SOFTFAIL=0.665, T_SPF_HELO_TEMPERROR=0.01 autolearn=no 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: , Cc: Leonardo Garcia , Peter Maydell , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Leonardo Garcia Signed-off-by: Leonardo Garcia Reviewed-by: Cédric Le Goater Message-Id: <3b228af4785241c7fb4a2c70f0c495d2a9adea83.1641405872.git.lagarcia@br.ibm.com> Signed-off-by: Cédric Le Goater --- docs/specs/ppc-spapr-hcalls.rst | 21 ++++++++--------- docs/system/ppc/pseries.rst | 42 ++++++++++++++++----------------- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/docs/specs/ppc-spapr-hcalls.rst b/docs/specs/ppc-spapr-hcalls.rst index 28daf9734a8e..6cdcef20265e 100644 --- a/docs/specs/ppc-spapr-hcalls.rst +++ b/docs/specs/ppc-spapr-hcalls.rst @@ -1,13 +1,12 @@ +====================== sPAPR hypervisor calls ----------------------- +====================== When used with the ``pseries`` machine type, ``qemu-system-ppc64`` implements -a set of hypervisor calls (a.k.a. hcalls) defined in the `Linux on Power -Architecture Reference document (LoPAR) -`_. -This document is a subset of the Power Architecture Platform Reference (PAPR+) -specification (IBM internal only), which is what PowerVM, the IBM proprietary -hypervisor, adheres to. +a set of hypervisor calls (a.k.a. hcalls) defined in the Linux on Power +Architecture Reference ([LoPAR]_) document. This document is a subset of the +Power Architecture Platform Reference (PAPR+) specification (IBM internal only), +which is what PowerVM, the IBM proprietary hypervisor, adheres to. The subset in LoPAR is selected based on the requirements of Linux as a guest. @@ -18,8 +17,8 @@ running in the guest and QEMU. All those hypercalls start at hcall number 0xf000 which correspond to an implementation specific range in PAPR. -H_RTAS (0xf000) -^^^^^^^^^^^^^^^ +``H_RTAS (0xf000)`` +=================== RTAS stands for Run-Time Abstraction Sercies and is a set of runtime services generally provided by the firmware inside the guest to the operating system. It @@ -44,8 +43,8 @@ Returns: ``H_PARAMETER``: Unknown token. -H_LOGICAL_MEMOP (0xf001) -^^^^^^^^^^^^^^^^^^^^^^^^ +``H_LOGICAL_MEMOP (0xf001)`` +============================ When the guest runs in "real mode" (in powerpc terminology this means with MMU disabled, i.e. guest effective address equals to guest physical address), it diff --git a/docs/system/ppc/pseries.rst b/docs/system/ppc/pseries.rst index 16394fa5218b..16893248151f 100644 --- a/docs/system/ppc/pseries.rst +++ b/docs/system/ppc/pseries.rst @@ -1,19 +1,18 @@ +=================================== pSeries family boards (``pseries``) =================================== -The Power machine para-virtualized environment described by the `Linux on Power -Architecture Reference document (LoPAR) -`_ -is called pSeries. This environment is also known as sPAPR, System p guests, or -simply Power Linux guests (although it is capable of running other operating -systems, such as AIX). +The Power machine para-virtualized environment described by the Linux on Power +Architecture Reference ([LoPAR]_) document is called pSeries. This environment +is also known as sPAPR, System p guests, or simply Power Linux guests (although +it is capable of running other operating systems, such as AIX). Even though pSeries is designed to behave as a guest environment, it is also capable of acting as a hypervisor OS, providing, on that role, nested virtualization capabilities. Supported devices ------------------ +================= * Multi processor support for many Power processors generations: POWER7, POWER7+, POWER8, POWER8NVL, POWER9, and Power10. Support for POWER5+ exists, @@ -26,12 +25,12 @@ Supported devices * PCIe device pass through. Missing devices ---------------- +=============== * SPICE support. Firmware --------- +======== `SLOF `_ (Slimline Open Firmware) is an implementation of the `IEEE 1275-1994, Standard for Boot (Initialization @@ -42,14 +41,14 @@ QEMU includes a prebuilt image of SLOF which is updated when a more recent version is required. Build directions ----------------- +================ .. code-block:: bash ./configure --target-list=ppc64-softmmu && make Running instructions --------------------- +==================== Someone can select the pSeries machine type by running QEMU with the following options: @@ -59,7 +58,7 @@ options: qemu-system-ppc64 -M pseries sPAPR devices -------------- +============= The sPAPR specification defines a set of para-virtualized devices, which are also supported by the pSeries machine in QEMU and can be instantiated with the @@ -102,11 +101,9 @@ device, or specify one with an ID NVRAM device with ``-global spapr-nvram.drive=pfid``. sPAPR specification -^^^^^^^^^^^^^^^^^^^ +------------------- -The main source of documentation on the sPAPR standard is the `Linux on Power -Architecture Reference document (LoPAR) -`_. +The main source of documentation on the sPAPR standard is the [LoPAR]_ document. However, documentation specific to QEMU's implementation of the specification can also be found in QEMU documentation: @@ -124,7 +121,7 @@ Other documentation available in QEMU docs directory: (``/docs/specs/ppc-spapr-uv-hcalls.txt``). Switching between the KVM-PR and KVM-HV kernel module ------------------------------------------------------ +===================================================== Currently, there are two implementations of KVM on Power, ``kvm_hv.ko`` and ``kvm_pr.ko``. @@ -139,7 +136,7 @@ possible to switch between the two modes with the ``kvm-type`` parameter: instead. KVM-PR -^^^^^^ +------ KVM-PR uses the so-called **PR**\ oblem state of the PPC CPUs to run the guests, i.e. the virtual machine is run in user mode and all privileged instructions @@ -166,7 +163,7 @@ In order to run KVM-PR guests with POWER9 processors, someone will need to start QEMU with ``kernel_irqchip=off`` command line option. KVM-HV -^^^^^^ +------ KVM-HV uses the hypervisor mode of more recent Power processors, that allow access to the bare metal hardware directly. Although POWER7 had this capability, @@ -188,7 +185,7 @@ CPUs generations, e.g. you can run a POWER7 guest on a POWER8 host by using ``-cpu POWER8,compat=power7`` as parameter to QEMU. Modules support ---------------- +=============== As noticed in the sections above, each module can run in a different environment. The following table shows with which environment each module can @@ -264,8 +261,11 @@ enabled, whether or not the guest has actually entered secure mode. Maintainer contact information ------------------------------- +============================== Cédric Le Goater Daniel Henrique Barboza + +.. [LoPAR] `Linux on Power Architecture Reference document (LoPAR) revision + 2.9 `_. From patchwork Wed Jan 12 11:55:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711389 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 94EB1C433EF for ; Wed, 12 Jan 2022 13:31:53 +0000 (UTC) Received: from localhost ([::1]:53446 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7djE-00080R-EQ for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:31:52 -0500 Received: from eggs.gnu.org ([209.51.188.92]:32836) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFv-0008Pn-De; Wed, 12 Jan 2022 06:57:31 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:8720) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFq-0007mD-B2; Wed, 12 Jan 2022 06:57:31 -0500 Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBPUm1018361; Wed, 12 Jan 2022 11:57:13 GMT Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dht5pf40e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:57:13 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBnG53025522; Wed, 12 Jan 2022 11:56:11 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma06ams.nl.ibm.com with ESMTP id 3df1vjas0u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:11 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBu8As30147054 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:08 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 32560A4E81; Wed, 12 Jan 2022 11:56:08 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E3A97A4E7E; Wed, 12 Jan 2022 11:56:07 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:07 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 2656022016C; Wed, 12 Jan 2022 12:56:07 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 08/34] target/ppc: powerpc_excp: Extract software TLB logging into a function Date: Wed, 12 Jan 2022 12:55:25 +0100 Message-Id: <20220112115551.987666-9-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: azl-MFTKDuMi0_N5yVKa-_r-fpFZSHRg X-Proofpoint-ORIG-GUID: azl-MFTKDuMi0_N5yVKa-_r-fpFZSHRg X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 mlxlogscore=726 suspectscore=0 adultscore=0 priorityscore=1501 impostorscore=0 clxscore=1034 malwarescore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas Signed-off-by: Fabiano Rosas Reviewed-by: David Gibson Reviewed-by: Richard Henderson Message-Id: <20220107222601.4101511-2-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/excp_helper.c | 65 +++++++++++++++++++++++----------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index a779dc936a55..2c5d5470de59 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -135,6 +135,41 @@ static void dump_hcall(CPUPPCState *env) env->nip); } +static void ppc_excp_debug_sw_tlb(CPUPPCState *env, int excp) +{ +#if defined(DEBUG_SOFTWARE_TLB) + const char *es; + target_ulong *miss, *cmp; + int en; + + if (!qemu_log_enabled()) { + return; + } + + if (excp == POWERPC_EXCP_IFTLB) { + es = "I"; + en = 'I'; + miss = &env->spr[SPR_IMISS]; + cmp = &env->spr[SPR_ICMP]; + } else { + if (excp == POWERPC_EXCP_DLTLB) { + es = "DL"; + } else { + es = "DS"; + } + en = 'D'; + miss = &env->spr[SPR_DMISS]; + cmp = &env->spr[SPR_DCMP]; + } + qemu_log("6xx %sTLB miss: %cM " TARGET_FMT_lx " %cC " + TARGET_FMT_lx " H1 " TARGET_FMT_lx " H2 " + TARGET_FMT_lx " %08x\n", es, en, *miss, en, *cmp, + env->spr[SPR_HASH1], env->spr[SPR_HASH2], + env->error_code); +#endif +} + + static int powerpc_reset_wakeup(CPUState *cs, CPUPPCState *env, int excp, target_ulong *msr) { @@ -777,34 +812,8 @@ static void powerpc_excp(PowerPCCPU *cpu, int excp) } /* fall through */ case POWERPC_EXCP_7x5: -#if defined(DEBUG_SOFTWARE_TLB) - if (qemu_log_enabled()) { - const char *es; - target_ulong *miss, *cmp; - int en; - - if (excp == POWERPC_EXCP_IFTLB) { - es = "I"; - en = 'I'; - miss = &env->spr[SPR_IMISS]; - cmp = &env->spr[SPR_ICMP]; - } else { - if (excp == POWERPC_EXCP_DLTLB) { - es = "DL"; - } else { - es = "DS"; - } - en = 'D'; - miss = &env->spr[SPR_DMISS]; - cmp = &env->spr[SPR_DCMP]; - } - qemu_log("6xx %sTLB miss: %cM " TARGET_FMT_lx " %cC " - TARGET_FMT_lx " H1 " TARGET_FMT_lx " H2 " - TARGET_FMT_lx " %08x\n", es, en, *miss, en, *cmp, - env->spr[SPR_HASH1], env->spr[SPR_HASH2], - env->error_code); - } -#endif + ppc_excp_debug_sw_tlb(env, excp); + msr |= env->crf[0] << 28; msr |= env->error_code; /* key, D/I, S/L bits */ /* Set way using a LRU mechanism */ From patchwork Wed Jan 12 11:55:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711322 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6AB49C433EF for ; Wed, 12 Jan 2022 12:17:47 +0000 (UTC) Received: from localhost ([::1]:50642 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cZW-0007T6-FQ for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:17:46 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60612) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEv-0006Tm-E9; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:32686) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEq-0007WC-Gm; Wed, 12 Jan 2022 06:56:27 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBPFT9013867; Wed, 12 Jan 2022 11:56:15 GMT Received: from ppma06fra.de.ibm.com (48.49.7a9f.ip4.static.sl-reverse.com [159.122.73.72]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhv9qvdbk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:14 +0000 Received: from pps.filterd (ppma06fra.de.ibm.com [127.0.0.1]) by ppma06fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBl4rb010451; Wed, 12 Jan 2022 11:56:12 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma06fra.de.ibm.com with ESMTP id 3df1vjs54s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:11 +0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBl6tu29884676 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:47:06 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id DDF72AE070; Wed, 12 Jan 2022 11:56:08 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9D028AE081; Wed, 12 Jan 2022 11:56:08 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av26.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:08 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id D3AE52201C6; Wed, 12 Jan 2022 12:56:07 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 09/34] target/ppc: powerpc_excp: Keep 60x/7x5 soft MMU logs active Date: Wed, 12 Jan 2022 12:55:26 +0100 Message-Id: <20220112115551.987666-10-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 1EGpQiR3nxOTgVPcWzG08dZIm22VxLbt X-Proofpoint-ORIG-GUID: 1EGpQiR3nxOTgVPcWzG08dZIm22VxLbt X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 phishscore=0 clxscore=1034 suspectscore=0 malwarescore=0 priorityscore=1501 mlxlogscore=999 mlxscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas Remove the compile time definition and make the logging be controlled by the `-d mmu` option in the cmdline. Signed-off-by: Fabiano Rosas Reviewed-by: Cédric Le Goater Reviewed-by: David Gibson Message-Id: <20220107222601.4101511-3-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/excp_helper.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index 2c5d5470de59..a12ed14c30d1 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -30,8 +30,6 @@ #include "exec/cpu_ldst.h" #endif -/* #define DEBUG_SOFTWARE_TLB */ - /*****************************************************************************/ /* Exception processing */ #if !defined(CONFIG_USER_ONLY) @@ -137,12 +135,11 @@ static void dump_hcall(CPUPPCState *env) static void ppc_excp_debug_sw_tlb(CPUPPCState *env, int excp) { -#if defined(DEBUG_SOFTWARE_TLB) const char *es; target_ulong *miss, *cmp; int en; - if (!qemu_log_enabled()) { + if (!qemu_loglevel_mask(CPU_LOG_MMU)) { return; } @@ -166,7 +163,6 @@ static void ppc_excp_debug_sw_tlb(CPUPPCState *env, int excp) TARGET_FMT_lx " %08x\n", es, en, *miss, en, *cmp, env->spr[SPR_HASH1], env->spr[SPR_HASH2], env->error_code); -#endif } From patchwork Wed Jan 12 11:55:27 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711329 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F0B81C433F5 for ; Wed, 12 Jan 2022 12:27:28 +0000 (UTC) Received: from localhost ([::1]:43556 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cit-0005RM-UN for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:27:27 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60568) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEs-0006Th-EB; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:39202 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEp-0007Vg-2G; Wed, 12 Jan 2022 06:56:26 -0500 Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBXKfw017828; Wed, 12 Jan 2022 11:56:15 GMT Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhvrc3vga-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:15 +0000 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmHAM022855; Wed, 12 Jan 2022 11:56:13 GMT Received: from b06avi18878370.portsmouth.uk.ibm.com (b06avi18878370.portsmouth.uk.ibm.com [9.149.26.194]) by ppma03fra.de.ibm.com with ESMTP id 3df289h0ub-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:13 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBu9vA46399930 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:09 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 97C8052067; Wed, 12 Jan 2022 11:56:09 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av21.portsmouth.uk.ibm.com (Postfix) with SMTP id 4DA8E52054; Wed, 12 Jan 2022 11:56:09 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 8D98022016C; Wed, 12 Jan 2022 12:56:08 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 10/34] target/ppc: powerpc_excp: Group unimplemented exceptions Date: Wed, 12 Jan 2022 12:55:27 +0100 Message-Id: <20220112115551.987666-11-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: NAM7RHV4vE2GJhF_bDr8x0RaRo7_IbiF X-Proofpoint-GUID: NAM7RHV4vE2GJhF_bDr8x0RaRo7_IbiF X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 suspectscore=0 clxscore=1034 adultscore=0 mlxscore=0 phishscore=0 impostorscore=0 spamscore=0 mlxlogscore=806 bulkscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas Signed-off-by: Fabiano Rosas Reviewed-by: Cédric Le Goater Reviewed-by: David Gibson Reviewed-by: Richard Henderson Message-Id: <20220107222601.4101511-4-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/excp_helper.c | 77 +++++----------------------------------- 1 file changed, 8 insertions(+), 69 deletions(-) diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index a12ed14c30d1..a52340ac0a46 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -700,23 +700,6 @@ static void powerpc_excp(PowerPCCPU *cpu, int excp) case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavailable/VPU */ env->spr[SPR_BOOKE_ESR] = ESR_SPV; break; - case POWERPC_EXCP_EFPDI: /* Embedded floating-point data interrupt */ - /* XXX: TODO */ - cpu_abort(cs, "Embedded floating point data exception " - "is not implemented yet !\n"); - env->spr[SPR_BOOKE_ESR] = ESR_SPV; - break; - case POWERPC_EXCP_EFPRI: /* Embedded floating-point round interrupt */ - /* XXX: TODO */ - cpu_abort(cs, "Embedded floating point round exception " - "is not implemented yet !\n"); - env->spr[SPR_BOOKE_ESR] = ESR_SPV; - break; - case POWERPC_EXCP_EPERFM: /* Embedded performance monitor interrupt */ - /* XXX: TODO */ - cpu_abort(cs, - "Performance counter exception is not implemented yet !\n"); - break; case POWERPC_EXCP_DOORI: /* Embedded doorbell interrupt */ break; case POWERPC_EXCP_DOORCI: /* Embedded doorbell critical interrupt */ @@ -781,19 +764,6 @@ static void powerpc_excp(PowerPCCPU *cpu, int excp) case POWERPC_EXCP_PIT: /* Programmable interval timer interrupt */ trace_ppc_excp_print("PIT"); break; - case POWERPC_EXCP_IO: /* IO error exception */ - /* XXX: TODO */ - cpu_abort(cs, "601 IO error exception is not implemented yet !\n"); - break; - case POWERPC_EXCP_RUNM: /* Run mode exception */ - /* XXX: TODO */ - cpu_abort(cs, "601 run mode exception is not implemented yet !\n"); - break; - case POWERPC_EXCP_EMUL: /* Emulation trap exception */ - /* XXX: TODO */ - cpu_abort(cs, "602 emulation trap exception " - "is not implemented yet !\n"); - break; case POWERPC_EXCP_IFTLB: /* Instruction fetch TLB error */ case POWERPC_EXCP_DLTLB: /* Data load TLB miss */ case POWERPC_EXCP_DSTLB: /* Data store TLB miss */ @@ -820,56 +790,25 @@ static void powerpc_excp(PowerPCCPU *cpu, int excp) break; } break; + case POWERPC_EXCP_EFPDI: /* Embedded floating-point data interrupt */ + case POWERPC_EXCP_EFPRI: /* Embedded floating-point round interrupt */ + case POWERPC_EXCP_EPERFM: /* Embedded performance monitor interrupt */ + case POWERPC_EXCP_IO: /* IO error exception */ + case POWERPC_EXCP_RUNM: /* Run mode exception */ + case POWERPC_EXCP_EMUL: /* Emulation trap exception */ case POWERPC_EXCP_FPA: /* Floating-point assist exception */ - /* XXX: TODO */ - cpu_abort(cs, "Floating point assist exception " - "is not implemented yet !\n"); - break; case POWERPC_EXCP_DABR: /* Data address breakpoint */ - /* XXX: TODO */ - cpu_abort(cs, "DABR exception is not implemented yet !\n"); - break; case POWERPC_EXCP_IABR: /* Instruction address breakpoint */ - /* XXX: TODO */ - cpu_abort(cs, "IABR exception is not implemented yet !\n"); - break; case POWERPC_EXCP_SMI: /* System management interrupt */ - /* XXX: TODO */ - cpu_abort(cs, "SMI exception is not implemented yet !\n"); - break; case POWERPC_EXCP_THERM: /* Thermal interrupt */ - /* XXX: TODO */ - cpu_abort(cs, "Thermal management exception " - "is not implemented yet !\n"); - break; case POWERPC_EXCP_PERFM: /* Embedded performance monitor interrupt */ - /* XXX: TODO */ - cpu_abort(cs, - "Performance counter exception is not implemented yet !\n"); - break; case POWERPC_EXCP_VPUA: /* Vector assist exception */ - /* XXX: TODO */ - cpu_abort(cs, "VPU assist exception is not implemented yet !\n"); - break; case POWERPC_EXCP_SOFTP: /* Soft patch exception */ - /* XXX: TODO */ - cpu_abort(cs, - "970 soft-patch exception is not implemented yet !\n"); - break; case POWERPC_EXCP_MAINT: /* Maintenance exception */ - /* XXX: TODO */ - cpu_abort(cs, - "970 maintenance exception is not implemented yet !\n"); - break; case POWERPC_EXCP_MEXTBR: /* Maskable external breakpoint */ - /* XXX: TODO */ - cpu_abort(cs, "Maskable external exception " - "is not implemented yet !\n"); - break; case POWERPC_EXCP_NMEXTBR: /* Non maskable external breakpoint */ - /* XXX: TODO */ - cpu_abort(cs, "Non maskable external exception " - "is not implemented yet !\n"); + cpu_abort(cs, "%s exception not implemented\n", + powerpc_excp_name(excp)); break; default: excp_invalid: From patchwork Wed Jan 12 11:55:28 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711360 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id B21B5C433EF for ; Wed, 12 Jan 2022 12:58:59 +0000 (UTC) Received: from localhost ([::1]:42336 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dDO-0001kl-LS for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:58:58 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60804) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFH-0006z4-37; Wed, 12 Jan 2022 06:56:51 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:9758 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFF-0007XN-Eg; Wed, 12 Jan 2022 06:56:50 -0500 Received: from pps.filterd (m0098420.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBaEAw004204; Wed, 12 Jan 2022 11:56:16 GMT Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dht3ff4vj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:15 +0000 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmHXE022857; Wed, 12 Jan 2022 11:56:14 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma03fra.de.ibm.com with ESMTP id 3df289h0un-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:14 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuAh233554924 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:10 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 47FDB5207B; Wed, 12 Jan 2022 11:56:10 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av21.portsmouth.uk.ibm.com (Postfix) with SMTP id 075035204E; Wed, 12 Jan 2022 11:56:09 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 47ED92201C6; Wed, 12 Jan 2022 12:56:09 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 11/34] target/ppc: Add HV support to ppc_interrupts_little_endian Date: Wed, 12 Jan 2022 12:55:28 +0100 Message-Id: <20220112115551.987666-12-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: TDjKeoZ-G1bLvPd69aGN8GGYK-vfcxL8 X-Proofpoint-ORIG-GUID: TDjKeoZ-G1bLvPd69aGN8GGYK-vfcxL8 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxlogscore=677 phishscore=0 spamscore=0 clxscore=1034 suspectscore=0 bulkscore=0 malwarescore=0 mlxscore=0 priorityscore=1501 impostorscore=0 adultscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas The ppc_interrupts_little_endian function could be used for interrupts delivered in Hypervisor mode, so add support for powernv8 and powernv9 to it. Also drop the comment because it is inaccurate, all CPUs that can run little endian can have interrupts in little endian. The point is whether they can take interrupts in an endianness different from MSR_LE. This change has no functional impact. Signed-off-by: Fabiano Rosas Reviewed-by: David Gibson Message-Id: <20220107222601.4101511-5-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/cpu.h | 23 +++++++++++++++-------- target/ppc/arch_dump.c | 2 +- target/ppc/excp_helper.c | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index f20d4ffa6d32..a6fc857ad4c2 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2728,20 +2728,27 @@ static inline bool ppc_has_spr(PowerPCCPU *cpu, int spr) return cpu->env.spr_cb[spr].name != NULL; } -static inline bool ppc_interrupts_little_endian(PowerPCCPU *cpu) +#if !defined(CONFIG_USER_ONLY) +static inline bool ppc_interrupts_little_endian(PowerPCCPU *cpu, bool hv) { PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); + CPUPPCState *env = &cpu->env; + bool ile = false; + + if (hv && env->has_hv_mode) { + if (is_isa300(pcc)) { + ile = !!(env->spr[SPR_HID0] & HID0_POWER9_HILE); + } else { + ile = !!(env->spr[SPR_HID0] & HID0_HILE); + } - /* - * Only models that have an LPCR and know about LPCR_ILE can do little - * endian. - */ - if (pcc->lpcr_mask & LPCR_ILE) { - return !!(cpu->env.spr[SPR_LPCR] & LPCR_ILE); + } else if (pcc->lpcr_mask & LPCR_ILE) { + ile = !!(env->spr[SPR_LPCR] & LPCR_ILE); } - return false; + return ile; } +#endif void dump_mmu(CPUPPCState *env); diff --git a/target/ppc/arch_dump.c b/target/ppc/arch_dump.c index bb392f6d8885..12cde198a315 100644 --- a/target/ppc/arch_dump.c +++ b/target/ppc/arch_dump.c @@ -237,7 +237,7 @@ int cpu_get_dump_info(ArchDumpInfo *info, info->d_machine = PPC_ELF_MACHINE; info->d_class = ELFCLASS; - if (ppc_interrupts_little_endian(cpu)) { + if (ppc_interrupts_little_endian(cpu, false)) { info->d_endian = ELFDATA2LSB; } else { info->d_endian = ELFDATA2MSB; diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index a52340ac0a46..3a430f23d6f3 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -1070,7 +1070,7 @@ void ppc_cpu_do_fwnmi_machine_check(CPUState *cs, target_ulong vector) */ msr = (1ULL << MSR_ME); msr |= env->msr & (1ULL << MSR_SF); - if (ppc_interrupts_little_endian(cpu)) { + if (ppc_interrupts_little_endian(cpu, false)) { msr |= (1ULL << MSR_LE); } From patchwork Wed Jan 12 11:55:29 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711388 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 723EDC433EF for ; Wed, 12 Jan 2022 13:28:12 +0000 (UTC) Received: from localhost ([::1]:50194 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dff-0005Mg-Cb for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:28:11 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60802) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFH-0006z2-2Y; Wed, 12 Jan 2022 06:56:51 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:44090 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFF-0007XC-GD; Wed, 12 Jan 2022 06:56:50 -0500 Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBLNsK019418; Wed, 12 Jan 2022 11:56:16 GMT Received: from ppma01fra.de.ibm.com (46.49.7a9f.ip4.static.sl-reverse.com [159.122.73.70]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhx1us7uy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:15 +0000 Received: from pps.filterd (ppma01fra.de.ibm.com [127.0.0.1]) by ppma01fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBlpf2025184; Wed, 12 Jan 2022 11:56:14 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma01fra.de.ibm.com with ESMTP id 3dfwhjc6h4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:13 +0000 Received: from b06wcsmtp001.portsmouth.uk.ibm.com (b06wcsmtp001.portsmouth.uk.ibm.com [9.149.105.160]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuBXa39125364 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:11 GMT Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1447EA4DF6; Wed, 12 Jan 2022 11:56:11 +0000 (GMT) Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C6B05A4E00; Wed, 12 Jan 2022 11:56:10 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by b06wcsmtp001.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:10 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 00EEC22016C; Wed, 12 Jan 2022 12:56:09 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 12/34] target/ppc: Add MSR_ILE support to ppc_interrupts_little_endian Date: Wed, 12 Jan 2022 12:55:29 +0100 Message-Id: <20220112115551.987666-13-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: T5PvcSD5YWV6C_H4i9TLUqC5rB6wEFY3 X-Proofpoint-ORIG-GUID: T5PvcSD5YWV6C_H4i9TLUqC5rB6wEFY3 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 impostorscore=0 clxscore=1034 phishscore=0 priorityscore=1501 mlxlogscore=807 malwarescore=0 spamscore=0 adultscore=0 lowpriorityscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas Some CPUs set ILE via an MSR bit. We can make ppc_interrupts_little_endian handle that case as well. Now we have a centralized way of determining the endianness of interrupts. This change has no functional impact. Signed-off-by: Fabiano Rosas Reviewed-by: David Gibson Message-Id: <20220107222601.4101511-6-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/cpu.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index a6fc857ad4c2..f99cd0ea92fc 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -2733,7 +2733,7 @@ static inline bool ppc_interrupts_little_endian(PowerPCCPU *cpu, bool hv) { PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); CPUPPCState *env = &cpu->env; - bool ile = false; + bool ile; if (hv && env->has_hv_mode) { if (is_isa300(pcc)) { @@ -2744,6 +2744,8 @@ static inline bool ppc_interrupts_little_endian(PowerPCCPU *cpu, bool hv) } else if (pcc->lpcr_mask & LPCR_ILE) { ile = !!(env->spr[SPR_LPCR] & LPCR_ILE); + } else { + ile = !!(msr_ile); } return ile; From patchwork Wed Jan 12 11:55:30 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711379 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F042EC433F5 for ; Wed, 12 Jan 2022 13:21:08 +0000 (UTC) Received: from localhost ([::1]:40604 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dYp-0006dt-O4 for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:21:07 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60760) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cF5-0006dy-12; Wed, 12 Jan 2022 06:56:42 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:11652) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEp-0007Ve-0w; Wed, 12 Jan 2022 06:56:38 -0500 Received: from pps.filterd (m0127361.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBqYsb012485; Wed, 12 Jan 2022 11:56:17 GMT Received: from ppma03ams.nl.ibm.com (62.31.33a9.ip4.static.sl-reverse.com [169.51.49.98]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhxgf8293-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:16 +0000 Received: from pps.filterd (ppma03ams.nl.ibm.com [127.0.0.1]) by ppma03ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBm1LT026902; Wed, 12 Jan 2022 11:56:15 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma03ams.nl.ibm.com with ESMTP id 3df289tmjb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:14 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBl8oh48103926 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:47:08 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C9F9E11C099; Wed, 12 Jan 2022 11:56:11 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7F98D11C09A; Wed, 12 Jan 2022 11:56:11 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:11 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id B6BA62201C6; Wed, 12 Jan 2022 12:56:10 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 13/34] target/ppc: Use ppc_interrupts_little_endian in powerpc_excp Date: Wed, 12 Jan 2022 12:55:30 +0100 Message-Id: <20220112115551.987666-14-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: LeMxgh8KenFqiq3r2U-mpkjiNO748PB6 X-Proofpoint-GUID: LeMxgh8KenFqiq3r2U-mpkjiNO748PB6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 mlxscore=0 malwarescore=0 phishscore=0 priorityscore=1501 bulkscore=0 adultscore=0 spamscore=0 impostorscore=0 clxscore=1034 mlxlogscore=555 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas The ppc_interrupts_little_endian function is now suitable for determining the endianness of interrupts for all CPUs. Signed-off-by: Fabiano Rosas Reviewed-by: David Gibson Message-Id: <20220107222601.4101511-7-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/excp_helper.c | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index 3a430f23d6f3..3b4123bc6590 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -832,36 +832,9 @@ static void powerpc_excp(PowerPCCPU *cpu, int excp) * Sort out endianness of interrupt, this differs depending on the * CPU, the HV mode, etc... */ -#ifdef TARGET_PPC64 - if (excp_model == POWERPC_EXCP_POWER7) { - if (!(new_msr & MSR_HVB) && (env->spr[SPR_LPCR] & LPCR_ILE)) { - new_msr |= (target_ulong)1 << MSR_LE; - } - } else if (excp_model == POWERPC_EXCP_POWER8) { - if (new_msr & MSR_HVB) { - if (env->spr[SPR_HID0] & HID0_HILE) { - new_msr |= (target_ulong)1 << MSR_LE; - } - } else if (env->spr[SPR_LPCR] & LPCR_ILE) { - new_msr |= (target_ulong)1 << MSR_LE; - } - } else if (excp_model == POWERPC_EXCP_POWER9 || - excp_model == POWERPC_EXCP_POWER10) { - if (new_msr & MSR_HVB) { - if (env->spr[SPR_HID0] & HID0_POWER9_HILE) { - new_msr |= (target_ulong)1 << MSR_LE; - } - } else if (env->spr[SPR_LPCR] & LPCR_ILE) { - new_msr |= (target_ulong)1 << MSR_LE; - } - } else if (msr_ile) { - new_msr |= (target_ulong)1 << MSR_LE; - } -#else - if (msr_ile) { + if (ppc_interrupts_little_endian(cpu, !!(new_msr & MSR_HVB))) { new_msr |= (target_ulong)1 << MSR_LE; } -#endif #if defined(TARGET_PPC64) if (excp_model == POWERPC_EXCP_BOOKE) { From patchwork Wed Jan 12 11:55:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711325 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7BA58C433EF for ; Wed, 12 Jan 2022 12:21:56 +0000 (UTC) Received: from localhost ([::1]:58986 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cdX-0004mr-IM for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:21:55 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60610) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEv-0006Tl-Di; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:9028 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEp-0007Vk-4m; Wed, 12 Jan 2022 06:56:26 -0500 Received: from pps.filterd (m0098416.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBWsDD018400; Wed, 12 Jan 2022 11:56:17 GMT Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhvrc3vhc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:17 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBnFjZ025509; Wed, 12 Jan 2022 11:56:15 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma06ams.nl.ibm.com with ESMTP id 3df1vjas3a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:15 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuCHX40960478 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:12 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7AA0EA4E61; Wed, 12 Jan 2022 11:56:12 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 369A1A4E6C; Wed, 12 Jan 2022 11:56:12 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:12 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 6F07322016C; Wed, 12 Jan 2022 12:56:11 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 14/34] target/ppc: Introduce a wrapper for powerpc_excp Date: Wed, 12 Jan 2022 12:55:31 +0100 Message-Id: <20220112115551.987666-15-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: wawuiJpSnU8BFZ8L9AU2BGFtLFU3U2IO X-Proofpoint-GUID: wawuiJpSnU8BFZ8L9AU2BGFtLFU3U2IO X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 suspectscore=0 clxscore=1034 adultscore=0 mlxscore=0 phishscore=0 impostorscore=0 spamscore=0 mlxlogscore=868 bulkscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas Next patches will split powerpc_excp in multiple family specific handlers. This patch adds a wrapper to make the transition clearer. Signed-off-by: Fabiano Rosas Reviewed-by: David Gibson Message-Id: <20220107222601.4101511-8-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/excp_helper.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c index 3b4123bc6590..bc646c67a0f5 100644 --- a/target/ppc/excp_helper.c +++ b/target/ppc/excp_helper.c @@ -396,7 +396,7 @@ static void powerpc_set_excp_state(PowerPCCPU *cpu, * Note that this function should be greatly optimized when called * with a constant excp, from ppc_hw_interrupt */ -static void powerpc_excp(PowerPCCPU *cpu, int excp) +static inline void powerpc_excp_legacy(PowerPCCPU *cpu, int excp) { CPUState *cs = CPU(cpu); CPUPPCState *env = &cpu->env; @@ -867,6 +867,16 @@ static void powerpc_excp(PowerPCCPU *cpu, int excp) powerpc_set_excp_state(cpu, vector, new_msr); } +static void powerpc_excp(PowerPCCPU *cpu, int excp) +{ + CPUPPCState *env = &cpu->env; + + switch (env->excp_model) { + default: + powerpc_excp_legacy(cpu, excp); + } +} + void ppc_cpu_do_interrupt(CPUState *cs) { PowerPCCPU *cpu = POWERPC_CPU(cs); From patchwork Wed Jan 12 11:55:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711335 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BDF76C433EF for ; Wed, 12 Jan 2022 12:33:45 +0000 (UTC) Received: from localhost ([::1]:51462 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7coy-0003Sc-My for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:33:44 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60662) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEw-0006Tu-U8; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:42228 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEv-0007XG-EJ; Wed, 12 Jan 2022 06:56:30 -0500 Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBLLNd019301; Wed, 12 Jan 2022 11:56:17 GMT Received: from ppma03ams.nl.ibm.com (62.31.33a9.ip4.static.sl-reverse.com [169.51.49.98]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhx1us7vy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:17 +0000 Received: from pps.filterd (ppma03ams.nl.ibm.com [127.0.0.1]) by ppma03ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBm1bu026921; Wed, 12 Jan 2022 11:56:16 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma03ams.nl.ibm.com with ESMTP id 3df289tmk5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:15 +0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuDnx41353526 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:13 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 360C7AE053; Wed, 12 Jan 2022 11:56:13 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E1CD0AE059; Wed, 12 Jan 2022 11:56:12 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av26.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:12 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 263DA2201C6; Wed, 12 Jan 2022 12:56:12 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 15/34] target/ppc: Set the correct endianness for powernv memory dumps Date: Wed, 12 Jan 2022 12:55:32 +0100 Message-Id: <20220112115551.987666-16-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: jDeJ8Bj863gR_39i7yH4BRtWWbSTAWh7 X-Proofpoint-ORIG-GUID: jDeJ8Bj863gR_39i7yH4BRtWWbSTAWh7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 impostorscore=0 clxscore=1034 phishscore=0 priorityscore=1501 mlxlogscore=549 malwarescore=0 spamscore=0 adultscore=0 lowpriorityscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , David Gibson , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= , Fabiano Rosas Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Fabiano Rosas We use the endianness of interrupts to determine which endianness to use for the guest kernel memory dump. For machines that support HILE (powernv8 and up) we have been always generating big endian dump files. This patch uses the HILE support recently added to ppc_interrupts_little_endian to fix the endianness of the dumps for powernv machines. Here are two dumps created at different moments: $ file skiboot.dump skiboot.dump: ELF 64-bit MSB core file, 64-bit PowerPC ... $ file kernel.dump kernel.dump: ELF 64-bit LSB core file, 64-bit PowerPC ... Suggested-by: David Gibson Signed-off-by: Fabiano Rosas Reviewed-by: David Gibson Message-Id: <20220107222601.4101511-9-farosas@linux.ibm.com> Signed-off-by: Cédric Le Goater --- target/ppc/arch_dump.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/target/ppc/arch_dump.c b/target/ppc/arch_dump.c index 12cde198a315..993740897d83 100644 --- a/target/ppc/arch_dump.c +++ b/target/ppc/arch_dump.c @@ -237,7 +237,7 @@ int cpu_get_dump_info(ArchDumpInfo *info, info->d_machine = PPC_ELF_MACHINE; info->d_class = ELFCLASS; - if (ppc_interrupts_little_endian(cpu, false)) { + if (ppc_interrupts_little_endian(cpu, cpu->env.has_hv_mode)) { info->d_endian = ELFDATA2LSB; } else { info->d_endian = ELFDATA2MSB; From patchwork Wed Jan 12 11:55:33 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711331 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 095CCC433EF for ; Wed, 12 Jan 2022 12:29:58 +0000 (UTC) Received: from localhost ([::1]:48324 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7clJ-0000Ta-08 for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:29:57 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60758) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cF4-0006dx-Fj; Wed, 12 Jan 2022 06:56:42 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:35766 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEo-0007VR-AD; Wed, 12 Jan 2022 06:56:38 -0500 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CApXZ7009724; Wed, 12 Jan 2022 11:56:19 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhwkut9ra-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:19 +0000 Received: from m0098414.ppops.net (m0098414.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBh2Yv005616; Wed, 12 Jan 2022 11:56:19 GMT Received: from ppma01fra.de.ibm.com (46.49.7a9f.ip4.static.sl-reverse.com [159.122.73.70]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhwkut9qg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:18 +0000 Received: from pps.filterd (ppma01fra.de.ibm.com [127.0.0.1]) by ppma01fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBlobE025169; Wed, 12 Jan 2022 11:56:17 GMT Received: from b06cxnps4074.portsmouth.uk.ibm.com (d06relay11.portsmouth.uk.ibm.com [9.149.109.196]) by ppma01fra.de.ibm.com with ESMTP id 3dfwhjc6jk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:17 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuDaH44302594 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:14 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CDECF11C08D; Wed, 12 Jan 2022 11:56:13 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 8B95C11C076; Wed, 12 Jan 2022 11:56:13 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:13 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id D25FD22016C; Wed, 12 Jan 2022 12:56:12 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 16/34] pnv_phb3.c: add unique chassis and slot for pnv_phb3_root_port Date: Wed, 12 Jan 2022 12:55:33 +0100 Message-Id: <20220112115551.987666-17-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: jdyLDZrb4hITGn8OHn6oj5nh8EsYnNcj X-Proofpoint-GUID: J1NDxiO4tiNH6KJh9bbDnsH-Hiaq9Wyv X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1034 phishscore=0 bulkscore=0 priorityscore=1501 adultscore=0 spamscore=0 mlxlogscore=999 lowpriorityscore=0 impostorscore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza When creating a pnv_phb3_root_port using the command line, the first root port is created successfully, but the second fails with the following error: qemu-system-ppc64: -device pnv-phb3-root-port,bus=phb3-root.0,id=pcie.3: Can't add chassis slot, error -16 This error comes from the realize() function of its parent type, rp_realize() from TYPE_PCIE_ROOT_PORT. pcie_chassis_add_slot() fails with -EBUSY if there's an existing PCIESlot that has the same chassis/slot value, regardless of being in a different bus. One way to prevent this error is simply set chassis and slot values in the command line. However, since phb3 root buses only supports a single root port, we can just get an unique chassis/slot value by checking which root bus the pnv_phb3_root_port is going to be attached, get the equivalent phb3 device and use its chip-id and index values, which are guaranteed to be unique. Signed-off-by: Daniel Henrique Barboza Message-Id: <20220105212338.49899-2-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb3.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c index c78084cce795..3467bbb5d9d8 100644 --- a/hw/pci-host/pnv_phb3.c +++ b/hw/pci-host/pnv_phb3.c @@ -1142,8 +1142,24 @@ static const TypeInfo pnv_phb3_root_bus_info = { static void pnv_phb3_root_port_realize(DeviceState *dev, Error **errp) { PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(dev); + PCIDevice *pci = PCI_DEVICE(dev); + PCIBus *bus = pci_get_bus(pci); + PnvPHB3 *phb = NULL; Error *local_err = NULL; + phb = (PnvPHB3 *) object_dynamic_cast(OBJECT(bus->qbus.parent), + TYPE_PNV_PHB3); + + if (!phb) { + error_setg(errp, +"pnv_phb3_root_port devices must be connected to pnv-phb3 buses"); + return; + } + + /* Set unique chassis/slot values for the root port */ + qdev_prop_set_uint8(&pci->qdev, "chassis", phb->chip_id); + qdev_prop_set_uint16(&pci->qdev, "slot", phb->phb_id); + rpc->parent_realize(dev, &local_err); if (local_err) { error_propagate(errp, local_err); From patchwork Wed Jan 12 11:55:34 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711334 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 68B9DC433EF for ; Wed, 12 Jan 2022 12:33:36 +0000 (UTC) Received: from localhost ([::1]:50736 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cop-0002cO-Dv for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:33:35 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60750) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cF0-0006YZ-1b; Wed, 12 Jan 2022 06:56:34 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:7092) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEx-0007Xw-3U; Wed, 12 Jan 2022 06:56:33 -0500 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAZfiv011436; Wed, 12 Jan 2022 11:56:20 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhthsxf43-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:20 +0000 Received: from m0098404.ppops.net (m0098404.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBq0gT001879; Wed, 12 Jan 2022 11:56:20 GMT Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhthsxf2m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:19 +0000 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmGIV022767; Wed, 12 Jan 2022 11:56:17 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma03fra.de.ibm.com with ESMTP id 3df289h0w6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:17 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBlBVl28705082 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:47:11 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7441AA4EB3; Wed, 12 Jan 2022 11:56:14 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 365B1A4EAD; Wed, 12 Jan 2022 11:56:14 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:14 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 7BE292201C6; Wed, 12 Jan 2022 12:56:13 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 17/34] pnv_phb4.c: add unique chassis and slot for pnv_phb4_root_port Date: Wed, 12 Jan 2022 12:55:34 +0100 Message-Id: <20220112115551.987666-18-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: iDRh3DDWkEaBtCYSbos7nFBHYS3_XigT X-Proofpoint-ORIG-GUID: pPHalKoTk_Y6icijBr5fwas03_Qt2913 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 clxscore=1034 malwarescore=0 bulkscore=0 phishscore=0 mlxlogscore=999 mlxscore=0 priorityscore=1501 adultscore=0 suspectscore=0 spamscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza A similar situation as described previously with pnv_phb3_root_port devices also happens with pnv_phb4_root_ports. The solution is the same: assign an unique chassis/slot combo for them. Signed-off-by: Daniel Henrique Barboza Message-Id: <20220105212338.49899-3-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb4.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index 5ba26e250a1f..836b0c156cc8 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -1338,8 +1338,23 @@ static void pnv_phb4_root_port_reset(DeviceState *dev) static void pnv_phb4_root_port_realize(DeviceState *dev, Error **errp) { PCIERootPortClass *rpc = PCIE_ROOT_PORT_GET_CLASS(dev); + PCIDevice *pci = PCI_DEVICE(dev); + PCIBus *bus = pci_get_bus(pci); + PnvPHB4 *phb = NULL; Error *local_err = NULL; + phb = (PnvPHB4 *) object_dynamic_cast(OBJECT(bus->qbus.parent), + TYPE_PNV_PHB4); + + if (!phb) { + error_setg(errp, "%s must be connected to pnv-phb4 buses", dev->id); + return; + } + + /* Set unique chassis/slot values for the root port */ + qdev_prop_set_uint8(&pci->qdev, "chassis", phb->chip_id); + qdev_prop_set_uint16(&pci->qdev, "slot", phb->phb_id); + rpc->parent_realize(dev, &local_err); if (local_err) { error_propagate(errp, local_err); From patchwork Wed Jan 12 11:55:35 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711317 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 74AB6C433F5 for ; Wed, 12 Jan 2022 12:12:32 +0000 (UTC) Received: from localhost ([::1]:39086 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cUR-0007N1-DB for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:12:31 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60608) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEv-0006Tk-Dj; Wed, 12 Jan 2022 06:56:30 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:14808) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEr-0007WN-En; Wed, 12 Jan 2022 06:56:28 -0500 Received: from pps.filterd (m0098393.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBSkkX019176; Wed, 12 Jan 2022 11:56:21 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dht5pf2vd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:20 +0000 Received: from m0098393.ppops.net (m0098393.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBsCjf016210; Wed, 12 Jan 2022 11:56:20 GMT Received: from ppma01fra.de.ibm.com (46.49.7a9f.ip4.static.sl-reverse.com [159.122.73.70]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dht5pf2tv-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:19 +0000 Received: from pps.filterd (ppma01fra.de.ibm.com [127.0.0.1]) by ppma01fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBlpQ5025188; Wed, 12 Jan 2022 11:56:17 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma01fra.de.ibm.com with ESMTP id 3dfwhjc6k6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:17 +0000 Received: from b06wcsmtp001.portsmouth.uk.ibm.com (b06wcsmtp001.portsmouth.uk.ibm.com [9.149.105.160]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuFwZ37814768 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:15 GMT Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 19082A4DFF; Wed, 12 Jan 2022 11:56:15 +0000 (GMT) Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D3540A4DF1; Wed, 12 Jan 2022 11:56:14 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by b06wcsmtp001.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:14 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 2586E22016C; Wed, 12 Jan 2022 12:56:14 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 18/34] ppc/pnv: Attach PHB3 root port device when defaults are enabled Date: Wed, 12 Jan 2022 12:55:35 +0100 Message-Id: <20220112115551.987666-19-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 3Avt6qYIrzWJhbAdMc5Bk13ENnsd3lm_ X-Proofpoint-ORIG-GUID: tSCATdCLTm_G7_vtTkbXSyggcVLmNcwG X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 mlxlogscore=999 suspectscore=0 adultscore=0 priorityscore=1501 impostorscore=0 clxscore=1034 malwarescore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" This cleanups the PHB3 model a bit more since the root port is an independent device and it will ease our task when adding user created PHB3s. pnv_phb_attach_root_port() is made public in pnv.c so it can be reused with the pnv_phb4 root port later. Signed-off-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220105212338.49899-4-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/pci-host/pnv_phb3.h | 2 -- include/hw/ppc/pnv.h | 1 + hw/pci-host/pnv_phb3.c | 15 ++++++--------- hw/ppc/pnv.c | 8 ++++++++ 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/include/hw/pci-host/pnv_phb3.h b/include/hw/pci-host/pnv_phb3.h index e9c13e6bd821..2e423c3890bc 100644 --- a/include/hw/pci-host/pnv_phb3.h +++ b/include/hw/pci-host/pnv_phb3.h @@ -155,8 +155,6 @@ struct PnvPHB3 { PnvPBCQState pbcq; - PnvPHB3RootPort root; - QLIST_HEAD(, PnvPhb3DMASpace) dma_spaces; PnvChip *chip; diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index c781525277db..c726288e5e5a 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -177,6 +177,7 @@ DECLARE_INSTANCE_CHECKER(PnvChip, PNV_CHIP_POWER10, TYPE_PNV_CHIP_POWER10) PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir); +void pnv_phb_attach_root_port(PCIHostState *pci, const char *name); #define TYPE_PNV_MACHINE MACHINE_TYPE_NAME("powernv") typedef struct PnvMachineClass PnvMachineClass; diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c index 3467bbb5d9d8..fdc8d0b437e4 100644 --- a/hw/pci-host/pnv_phb3.c +++ b/hw/pci-host/pnv_phb3.c @@ -19,6 +19,7 @@ #include "hw/irq.h" #include "hw/qdev-properties.h" #include "qom/object.h" +#include "sysemu/sysemu.h" #define phb3_error(phb, fmt, ...) \ qemu_log_mask(LOG_GUEST_ERROR, "phb3[%d:%d]: " fmt "\n", \ @@ -981,10 +982,6 @@ static void pnv_phb3_instance_init(Object *obj) /* Power Bus Common Queue */ object_initialize_child(obj, "pbcq", &phb->pbcq, TYPE_PNV_PBCQ); - /* Root Port */ - object_initialize_child(obj, "root", &phb->root, TYPE_PNV_PHB3_ROOT_PORT); - qdev_prop_set_int32(DEVICE(&phb->root), "addr", PCI_DEVFN(0, 0)); - qdev_prop_set_bit(DEVICE(&phb->root), "multifunction", false); } static void pnv_phb3_realize(DeviceState *dev, Error **errp) @@ -1053,10 +1050,10 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp) pci_setup_iommu(pci->bus, pnv_phb3_dma_iommu, phb); - /* Add a single Root port */ - qdev_prop_set_uint8(DEVICE(&phb->root), "chassis", phb->chip_id); - qdev_prop_set_uint16(DEVICE(&phb->root), "slot", phb->phb_id); - qdev_realize(DEVICE(&phb->root), BUS(pci->bus), &error_fatal); + if (defaults_enabled()) { + pnv_phb_attach_root_port(PCI_HOST_BRIDGE(phb), + TYPE_PNV_PHB3_ROOT_PORT); + } } void pnv_phb3_update_regions(PnvPHB3 *phb) @@ -1177,7 +1174,7 @@ static void pnv_phb3_root_port_class_init(ObjectClass *klass, void *data) device_class_set_parent_realize(dc, pnv_phb3_root_port_realize, &rpc->parent_realize); - dc->user_creatable = false; + dc->user_creatable = true; k->vendor_id = PCI_VENDOR_ID_IBM; k->device_id = 0x03dc; diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 9de8b8353014..3a263f631a27 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1156,6 +1156,14 @@ static void pnv_chip_icp_realize(Pnv8Chip *chip8, Error **errp) } } +/* Attach a root port device */ +void pnv_phb_attach_root_port(PCIHostState *pci, const char *name) +{ + PCIDevice *root = pci_new(PCI_DEVFN(0, 0), name); + + pci_realize_and_unref(root, pci->bus, &error_fatal); +} + static void pnv_chip_power8_realize(DeviceState *dev, Error **errp) { PnvChipClass *pcc = PNV_CHIP_GET_CLASS(dev); From patchwork Wed Jan 12 11:55:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711364 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 73225C433EF for ; Wed, 12 Jan 2022 13:07:02 +0000 (UTC) Received: from localhost ([::1]:51832 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dLB-0001UA-Ft for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:07:01 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60916) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFM-00074o-Uh; Wed, 12 Jan 2022 06:56:56 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:55914) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFJ-0007Yy-6i; Wed, 12 Jan 2022 06:56:55 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CB5v1q017168; Wed, 12 Jan 2022 11:56:23 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0u6v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:22 +0000 Received: from m0098396.ppops.net (m0098396.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CAXDg6026419; Wed, 12 Jan 2022 11:56:22 GMT Received: from ppma05fra.de.ibm.com (6c.4a.5195.ip4.static.sl-reverse.com [149.81.74.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0u55-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:22 +0000 Received: from pps.filterd (ppma05fra.de.ibm.com [127.0.0.1]) by ppma05fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmReT031224; Wed, 12 Jan 2022 11:56:19 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma05fra.de.ibm.com with ESMTP id 3df289h2u8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:19 +0000 Received: from b06wcsmtp001.portsmouth.uk.ibm.com (b06wcsmtp001.portsmouth.uk.ibm.com [9.149.105.160]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuFvk42467604 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:15 GMT Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B5947A4E00; Wed, 12 Jan 2022 11:56:15 +0000 (GMT) Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7C3ADA4DF7; Wed, 12 Jan 2022 11:56:15 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by b06wcsmtp001.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:15 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id C21F22201C6; Wed, 12 Jan 2022 12:56:14 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 19/34] pnv_phb4.c: make pnv-phb4-root-port user creatable Date: Wed, 12 Jan 2022 12:55:36 +0100 Message-Id: <20220112115551.987666-20-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: rSyb17sn4wFeeS_Fy7X65cUG4n7c6_qI X-Proofpoint-GUID: hZ1Fq6LmVmS80iS6TFosqTr9HhaeuT56 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 mlxlogscore=782 malwarescore=0 bulkscore=0 clxscore=1034 priorityscore=1501 phishscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 mlxscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza We want to create only the absolutely minimal amount of devices when running with -nodefaults. The root port is something that the machine can boot up without. But, to do that, we need to provide a way for the user to add them by hand. This patch makes pnv-phb4-root-port user creatable and then uses the pnv_phb_attach_root_port() helper to add a pnv_phb4_root_port only when running with default settings. Signed-off-by: Daniel Henrique Barboza Message-Id: <20220105212338.49899-5-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/pci-host/pnv_phb4.h | 2 -- hw/pci-host/pnv_phb4.c | 18 +++++++----------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/include/hw/pci-host/pnv_phb4.h b/include/hw/pci-host/pnv_phb4.h index 4a19338db35e..ea63df967678 100644 --- a/include/hw/pci-host/pnv_phb4.h +++ b/include/hw/pci-host/pnv_phb4.h @@ -78,8 +78,6 @@ OBJECT_DECLARE_SIMPLE_TYPE(PnvPHB4, PNV_PHB4) struct PnvPHB4 { PCIExpressHost parent_obj; - PnvPHB4RootPort root; - uint32_t chip_id; uint32_t phb_id; diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index 836b0c156cc8..14827f846434 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -22,6 +22,7 @@ #include "hw/irq.h" #include "hw/qdev-properties.h" #include "qom/object.h" +#include "sysemu/sysemu.h" #include "trace.h" #define phb_error(phb, fmt, ...) \ @@ -1159,12 +1160,6 @@ static void pnv_phb4_instance_init(Object *obj) /* XIVE interrupt source object */ object_initialize_child(obj, "source", &phb->xsrc, TYPE_XIVE_SOURCE); - - /* Root Port */ - object_initialize_child(obj, "root", &phb->root, TYPE_PNV_PHB4_ROOT_PORT); - - qdev_prop_set_int32(DEVICE(&phb->root), "addr", PCI_DEVFN(0, 0)); - qdev_prop_set_bit(DEVICE(&phb->root), "multifunction", false); } static void pnv_phb4_realize(DeviceState *dev, Error **errp) @@ -1208,10 +1203,11 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp) pci_setup_iommu(pci->bus, pnv_phb4_dma_iommu, phb); pci->bus->flags |= PCI_BUS_EXTENDED_CONFIG_SPACE; - /* Add a single Root port */ - qdev_prop_set_uint8(DEVICE(&phb->root), "chassis", phb->chip_id); - qdev_prop_set_uint16(DEVICE(&phb->root), "slot", phb->phb_id); - qdev_realize(DEVICE(&phb->root), BUS(pci->bus), &error_fatal); + /* Add a single Root port if running with defaults */ + if (defaults_enabled()) { + pnv_phb_attach_root_port(PCI_HOST_BRIDGE(phb), + TYPE_PNV_PHB4_ROOT_PORT); + } /* Setup XIVE Source */ if (phb->big_phb) { @@ -1369,7 +1365,7 @@ static void pnv_phb4_root_port_class_init(ObjectClass *klass, void *data) PCIERootPortClass *rpc = PCIE_ROOT_PORT_CLASS(klass); dc->desc = "IBM PHB4 PCIE Root Port"; - dc->user_creatable = false; + dc->user_creatable = true; device_class_set_parent_realize(dc, pnv_phb4_root_port_realize, &rpc->parent_realize); From patchwork Wed Jan 12 11:55:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711328 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E9DDCC433F5 for ; Wed, 12 Jan 2022 12:27:17 +0000 (UTC) Received: from localhost ([::1]:42766 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cii-0004v2-Ut for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:27:16 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60756) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cF0-0006Yb-Nb; Wed, 12 Jan 2022 06:56:35 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:55372) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEy-0007YN-Fs; Wed, 12 Jan 2022 06:56:34 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CB3n9s017249; Wed, 12 Jan 2022 11:56:22 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0u5y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:21 +0000 Received: from m0098396.ppops.net (m0098396.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CAvCww005902; Wed, 12 Jan 2022 11:56:21 GMT Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0u4e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:21 +0000 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmHrD022854; Wed, 12 Jan 2022 11:56:18 GMT Received: from b06avi18878370.portsmouth.uk.ibm.com (b06avi18878370.portsmouth.uk.ibm.com [9.149.26.194]) by ppma03fra.de.ibm.com with ESMTP id 3df289h0x7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:18 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuGgO35127636 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:16 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 57DB052078; Wed, 12 Jan 2022 11:56:16 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av21.portsmouth.uk.ibm.com (Postfix) with SMTP id 202AD52069; Wed, 12 Jan 2022 11:56:16 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 6C87722016C; Wed, 12 Jan 2022 12:56:15 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 20/34] pnv_phb4.c: check if root port exists in rc_config functions Date: Wed, 12 Jan 2022 12:55:37 +0100 Message-Id: <20220112115551.987666-21-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: HPn8AQFuebmQ5KvqZRFNwdscuawGz18y X-Proofpoint-GUID: RjsbwfnFLyzbd9jKI8lA52vcr7D5M96p X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 mlxlogscore=999 malwarescore=0 bulkscore=0 clxscore=1034 priorityscore=1501 phishscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 mlxscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza pnv_phb4_rc_config_read() and pnv_phb4_rc_config_write() are asserting the existence of the root port. The root port is now optional, and there will be cases where a pnv-phb4 device won't have a root port attached. Instead of asserting, check if the root port exists before read/writing into it. Signed-off-by: Daniel Henrique Barboza Message-Id: <20220105212338.49899-6-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb4.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index 14827f846434..83dedc878a57 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -152,7 +152,10 @@ static void pnv_phb4_rc_config_write(PnvPHB4 *phb, unsigned off, } pdev = pci_find_device(pci->bus, 0, 0); - assert(pdev); + if (!pdev) { + phb_error(phb, "rc_config_write device not found\n"); + return; + } pci_host_config_write_common(pdev, off, PHB_RC_CONFIG_SIZE, bswap32(val), 4); @@ -171,7 +174,10 @@ static uint64_t pnv_phb4_rc_config_read(PnvPHB4 *phb, unsigned off, } pdev = pci_find_device(pci->bus, 0, 0); - assert(pdev); + if (!pdev) { + phb_error(phb, "rc_config_read device not found\n"); + return ~0ull; + } val = pci_host_config_read_common(pdev, off, PHB_RC_CONFIG_SIZE, 4); return bswap32(val); From patchwork Wed Jan 12 11:55:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711363 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F3059C433F5 for ; Wed, 12 Jan 2022 13:06:25 +0000 (UTC) Received: from localhost ([::1]:50806 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dKa-0000fn-QW for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:06:24 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60814) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFI-000727-Cl; Wed, 12 Jan 2022 06:56:52 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:50568) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFG-0007Xr-E5; Wed, 12 Jan 2022 06:56:52 -0500 Received: from pps.filterd (m0098417.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBdWWO029037; Wed, 12 Jan 2022 11:56:22 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhac0kft6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:21 +0000 Received: from m0098417.ppops.net (m0098417.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBsspd024414; Wed, 12 Jan 2022 11:56:21 GMT Received: from ppma01fra.de.ibm.com (46.49.7a9f.ip4.static.sl-reverse.com [159.122.73.70]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhac0kfry-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:21 +0000 Received: from pps.filterd (ppma01fra.de.ibm.com [127.0.0.1]) by ppma01fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBlpQ7025188; Wed, 12 Jan 2022 11:56:19 GMT Received: from b06avi18878370.portsmouth.uk.ibm.com (b06avi18878370.portsmouth.uk.ibm.com [9.149.26.194]) by ppma01fra.de.ibm.com with ESMTP id 3dfwhjc6m5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:19 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06avi18878370.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuHqV35455398 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:17 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 17B3B11C08E; Wed, 12 Jan 2022 11:56:17 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CA36711C07B; Wed, 12 Jan 2022 11:56:16 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:16 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 1A42C2201C6; Wed, 12 Jan 2022 12:56:16 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 21/34] ppc/pnv: Introduce support for user created PHB3 devices Date: Wed, 12 Jan 2022 12:55:38 +0100 Message-Id: <20220112115551.987666-22-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: JXbylMKPqnwq_040XbKhOZWfDVKZM-p_ X-Proofpoint-ORIG-GUID: bxHPklVmY4xYlp3ZztBVoEoLidn2QVmG X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1034 adultscore=0 priorityscore=1501 mlxscore=0 spamscore=0 malwarescore=0 bulkscore=0 phishscore=0 lowpriorityscore=0 mlxlogscore=999 suspectscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" PHB3 devices and PCI devices can now be added to the powernv8 machine using : -device pnv-phb3,chip-id=0,index=1 \ -device nec-usb-xhci,bus=pci.1,addr=0x0 The 'index' property identifies the PHB3 in the chip. In case of user created devices, a lookup on 'chip-id' is required to assign the owning chip. Reviewed-by: Daniel Henrique Barboza Signed-off-by: Cédric Le Goater Message-Id: <20220105212338.49899-7-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/ppc/pnv.h | 2 ++ hw/pci-host/pnv_phb3.c | 11 ++++++++++- hw/ppc/pnv.c | 23 ++++++++++++++++++----- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index c726288e5e5a..64bab7112be3 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -218,6 +218,8 @@ struct PnvMachineState { hwaddr fw_load_addr; }; +PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id); + #define PNV_FDT_ADDR 0x01000000 #define PNV_TIMEBASE_FREQ 512000000ULL diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c index fdc8d0b437e4..1ebe43df5dd1 100644 --- a/hw/pci-host/pnv_phb3.c +++ b/hw/pci-host/pnv_phb3.c @@ -991,6 +991,15 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp) PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine()); int i; + /* User created devices */ + if (!phb->chip) { + phb->chip = pnv_get_chip(pnv, phb->chip_id); + if (!phb->chip) { + error_setg(errp, "invalid chip id: %d", phb->chip_id); + return; + } + } + if (phb->phb_id >= PNV_CHIP_GET_CLASS(phb->chip)->num_phbs) { error_setg(errp, "invalid PHB index: %d", phb->phb_id); return; @@ -1104,7 +1113,7 @@ static void pnv_phb3_class_init(ObjectClass *klass, void *data) dc->realize = pnv_phb3_realize; device_class_set_props(dc, pnv_phb3_properties); set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); - dc->user_creatable = false; + dc->user_creatable = true; } static const TypeInfo pnv_phb3_type_info = { diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 3a263f631a27..ad02d56aa75e 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1117,14 +1117,14 @@ static void pnv_chip_power8_instance_init(Object *obj) object_initialize_child(obj, "homer", &chip8->homer, TYPE_PNV8_HOMER); - for (i = 0; i < pcc->num_phbs; i++) { + if (defaults_enabled()) { + chip->num_phbs = pcc->num_phbs; + } + + for (i = 0; i < chip->num_phbs; i++) { object_initialize_child(obj, "phb[*]", &chip8->phbs[i], TYPE_PNV_PHB3); } - /* - * Number of PHBs is the chip default - */ - chip->num_phbs = pcc->num_phbs; } static void pnv_chip_icp_realize(Pnv8Chip *chip8, Error **errp) @@ -1814,6 +1814,19 @@ static ICSState *pnv_ics_get(XICSFabric *xi, int irq) return NULL; } +PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id) +{ + int i; + + for (i = 0; i < pnv->num_chips; i++) { + PnvChip *chip = pnv->chips[i]; + if (chip->chip_id == chip_id) { + return chip; + } + } + return NULL; +} + static int pnv_ics_resend_child(Object *child, void *opaque) { PnvPHB3 *phb3 = (PnvPHB3 *) object_dynamic_cast(child, TYPE_PNV_PHB3); From patchwork Wed Jan 12 11:55:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711362 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 1BA1BC433EF for ; Wed, 12 Jan 2022 13:03:49 +0000 (UTC) Received: from localhost ([::1]:48352 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dI4-0006y9-19 for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:03:48 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60922) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFN-00074z-17; Wed, 12 Jan 2022 06:56:57 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:62354) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFJ-0007Z0-6v; Wed, 12 Jan 2022 06:56:55 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBLUkw012837; Wed, 12 Jan 2022 11:56:23 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhv9qvdjb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:23 +0000 Received: from m0098394.ppops.net (m0098394.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBj8nS024310; Wed, 12 Jan 2022 11:56:22 GMT Received: from ppma01fra.de.ibm.com (46.49.7a9f.ip4.static.sl-reverse.com [159.122.73.70]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhv9qvdh6-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:22 +0000 Received: from pps.filterd (ppma01fra.de.ibm.com [127.0.0.1]) by ppma01fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBlpfE025184; Wed, 12 Jan 2022 11:56:20 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma01fra.de.ibm.com with ESMTP id 3dfwhjc6mh-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:20 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBlF1b47907316 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:47:15 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0573B11C094; Wed, 12 Jan 2022 11:56:18 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B255511C09A; Wed, 12 Jan 2022 11:56:17 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:17 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id BB5E322016C; Wed, 12 Jan 2022 12:56:16 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 22/34] ppc/pnv: Reparent user created PHB3 devices to the PnvChip Date: Wed, 12 Jan 2022 12:55:39 +0100 Message-Id: <20220112115551.987666-23-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: iUyjCI1F-CTL7WHghZslQCPUluoF5mcU X-Proofpoint-ORIG-GUID: XELaXTlMsPk8pbs8mUAgGokseBZ0_3mh X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 phishscore=0 clxscore=1034 suspectscore=0 malwarescore=0 priorityscore=1501 mlxlogscore=999 mlxscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Frederic Barrat , Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" The powernv machine uses the object hierarchy to populate the device tree and each device should be parented to the chip it belongs to. This is not the case for user created devices which are parented to the container "/unattached". Make sure a PHB3 device is parented to its chip by reparenting the object if necessary. Reviewed-by: Daniel Henrique Barboza Reviewed-by: Frederic Barrat Signed-off-by: Cédric Le Goater Message-Id: <20220105212338.49899-8-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/ppc/pnv.h | 1 + hw/pci-host/pnv_phb3.c | 6 ++++++ hw/ppc/pnv.c | 17 +++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index 64bab7112be3..f4219da7c516 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -178,6 +178,7 @@ DECLARE_INSTANCE_CHECKER(PnvChip, PNV_CHIP_POWER10, PowerPCCPU *pnv_chip_find_cpu(PnvChip *chip, uint32_t pir); void pnv_phb_attach_root_port(PCIHostState *pci, const char *name); +void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index); #define TYPE_PNV_MACHINE MACHINE_TYPE_NAME("powernv") typedef struct PnvMachineClass PnvMachineClass; diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c index 1ebe43df5dd1..a52aedcad31b 100644 --- a/hw/pci-host/pnv_phb3.c +++ b/hw/pci-host/pnv_phb3.c @@ -998,6 +998,12 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp) error_setg(errp, "invalid chip id: %d", phb->chip_id); return; } + + /* + * Reparent user created devices to the chip to build + * correctly the device tree. + */ + pnv_chip_parent_fixup(phb->chip, OBJECT(phb), phb->phb_id); } if (phb->phb_id >= PNV_CHIP_GET_CLASS(phb->chip)->num_phbs) { diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index ad02d56aa75e..fa5e7bc75192 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1814,6 +1814,23 @@ static ICSState *pnv_ics_get(XICSFabric *xi, int irq) return NULL; } +void pnv_chip_parent_fixup(PnvChip *chip, Object *obj, int index) +{ + Object *parent = OBJECT(chip); + g_autofree char *default_id = + g_strdup_printf("%s[%d]", object_get_typename(obj), index); + + if (obj->parent == parent) { + return; + } + + object_ref(obj); + object_unparent(obj); + object_property_add_child( + parent, DEVICE(obj)->id ? DEVICE(obj)->id : default_id, obj); + object_unref(obj); +} + PnvChip *pnv_get_chip(PnvMachineState *pnv, uint32_t chip_id) { int i; From patchwork Wed Jan 12 11:55:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711361 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 94F5EC433EF for ; Wed, 12 Jan 2022 13:00:21 +0000 (UTC) Received: from localhost ([::1]:44362 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dEg-0003mq-Ts for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:00:18 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60698) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEy-0006Wg-Cp; Wed, 12 Jan 2022 06:56:32 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:33304 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEv-0007Wx-Fg; Wed, 12 Jan 2022 06:56:31 -0500 Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBLNsR019418; Wed, 12 Jan 2022 11:56:24 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhx1us80y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:23 +0000 Received: from m0098419.ppops.net (m0098419.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBb5gL002051; Wed, 12 Jan 2022 11:56:23 GMT Received: from ppma05fra.de.ibm.com (6c.4a.5195.ip4.static.sl-reverse.com [149.81.74.108]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhx1us7yy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:23 +0000 Received: from pps.filterd (ppma05fra.de.ibm.com [127.0.0.1]) by ppma05fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmRb9031228; Wed, 12 Jan 2022 11:56:21 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma05fra.de.ibm.com with ESMTP id 3df289h2vd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:21 +0000 Received: from b06wcsmtp001.portsmouth.uk.ibm.com (b06wcsmtp001.portsmouth.uk.ibm.com [9.149.105.160]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuIX429032860 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:18 GMT Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id A2CDBA4E25; Wed, 12 Jan 2022 11:56:18 +0000 (GMT) Received: from b06wcsmtp001.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5EE78A4E12; Wed, 12 Jan 2022 11:56:18 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by b06wcsmtp001.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:18 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id A2FA82201C6; Wed, 12 Jan 2022 12:56:17 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 23/34] ppc/pnv: Complete user created PHB3 devices Date: Wed, 12 Jan 2022 12:55:40 +0100 Message-Id: <20220112115551.987666-24-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: YRfncmpcVUsHjZpIKunxyz7PkJaoa8bX X-Proofpoint-ORIG-GUID: G2ST7rxO6GD5c9Fip150nmKYhFm8kToB X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 impostorscore=0 clxscore=1034 phishscore=0 priorityscore=1501 mlxlogscore=766 malwarescore=0 spamscore=0 adultscore=0 lowpriorityscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" PHB3s ared SysBus devices and should be allowed to be dynamically created. Reviewed-by: Daniel Henrique Barboza Signed-off-by: Cédric Le Goater Message-Id: <20220105212338.49899-9-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb3.c | 9 +++++++++ hw/ppc/pnv.c | 2 ++ 2 files changed, 11 insertions(+) diff --git a/hw/pci-host/pnv_phb3.c b/hw/pci-host/pnv_phb3.c index a52aedcad31b..7fb35dc03147 100644 --- a/hw/pci-host/pnv_phb3.c +++ b/hw/pci-host/pnv_phb3.c @@ -993,6 +993,9 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp) /* User created devices */ if (!phb->chip) { + Error *local_err = NULL; + BusState *s; + phb->chip = pnv_get_chip(pnv, phb->chip_id); if (!phb->chip) { error_setg(errp, "invalid chip id: %d", phb->chip_id); @@ -1004,6 +1007,12 @@ static void pnv_phb3_realize(DeviceState *dev, Error **errp) * correctly the device tree. */ pnv_chip_parent_fixup(phb->chip, OBJECT(phb), phb->phb_id); + + s = qdev_get_parent_bus(DEVICE(phb->chip)); + if (!qdev_set_parent_bus(DEVICE(phb), s, &local_err)) { + error_propagate(errp, local_err); + return; + } } if (phb->phb_id >= PNV_CHIP_GET_CLASS(phb->chip)->num_phbs) { diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index fa5e7bc75192..8dc63823573e 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1941,6 +1941,8 @@ static void pnv_machine_power8_class_init(ObjectClass *oc, void *data) pmc->compat = compat; pmc->compat_size = sizeof(compat); + + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_PNV_PHB3); } static void pnv_machine_power9_class_init(ObjectClass *oc, void *data) From patchwork Wed Jan 12 11:55:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711353 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 251A8C433F5 for ; Wed, 12 Jan 2022 12:45:05 +0000 (UTC) Received: from localhost ([::1]:60502 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7czw-0002As-06 for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:45:04 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60740) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEz-0006YW-Kh; Wed, 12 Jan 2022 06:56:35 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:31768) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEw-0007Xj-F6; Wed, 12 Jan 2022 06:56:33 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBKECU013932; Wed, 12 Jan 2022 11:56:26 GMT Received: from ppma04ams.nl.ibm.com (63.31.33a9.ip4.static.sl-reverse.com [169.51.49.99]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhv9qvdjq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:25 +0000 Received: from pps.filterd (ppma04ams.nl.ibm.com [127.0.0.1]) by ppma04ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBkx1s018215; Wed, 12 Jan 2022 11:56:23 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma04ams.nl.ibm.com with ESMTP id 3df289ap2h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:23 +0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuJ1H36438372 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:19 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 34E77AE05A; Wed, 12 Jan 2022 11:56:19 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 04906AE078; Wed, 12 Jan 2022 11:56:19 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av26.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:18 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 4F38922016C; Wed, 12 Jan 2022 12:56:18 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 24/34] ppc/pnv: Move num_phbs under Pnv8Chip Date: Wed, 12 Jan 2022 12:55:41 +0100 Message-Id: <20220112115551.987666-25-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: PUgyTkUzfeMBQUlIXIeg8kVUlphbjhsc X-Proofpoint-ORIG-GUID: PUgyTkUzfeMBQUlIXIeg8kVUlphbjhsc X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 phishscore=0 clxscore=1034 suspectscore=0 malwarescore=0 priorityscore=1501 mlxlogscore=999 mlxscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" It is not used elsewhere so that's where it belongs. Signed-off-by: Cédric Le Goater Message-Id: <20220105212338.49899-10-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/ppc/pnv.h | 4 ++-- hw/ppc/pnv.c | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/include/hw/ppc/pnv.h b/include/hw/ppc/pnv.h index f4219da7c516..0e9e16544f30 100644 --- a/include/hw/ppc/pnv.h +++ b/include/hw/ppc/pnv.h @@ -52,7 +52,6 @@ struct PnvChip { uint64_t cores_mask; PnvCore **cores; - uint32_t num_phbs; uint32_t num_pecs; MemoryRegion xscom_mmio; @@ -82,6 +81,7 @@ struct Pnv8Chip { #define PNV8_CHIP_PHB3_MAX 4 PnvPHB3 phbs[PNV8_CHIP_PHB3_MAX]; + uint32_t num_phbs; XICSFabric *xics; }; @@ -136,8 +136,8 @@ struct PnvChipClass { /*< public >*/ uint64_t chip_cfam_id; uint64_t cores_mask; - uint32_t num_phbs; uint32_t num_pecs; + uint32_t num_phbs; DeviceRealize parent_realize; diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index 8dc63823573e..fe7e67e73a3c 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1099,7 +1099,6 @@ static void pnv_chip_power10_intc_print_info(PnvChip *chip, PowerPCCPU *cpu, static void pnv_chip_power8_instance_init(Object *obj) { - PnvChip *chip = PNV_CHIP(obj); Pnv8Chip *chip8 = PNV8_CHIP(obj); PnvChipClass *pcc = PNV_CHIP_GET_CLASS(obj); int i; @@ -1118,10 +1117,10 @@ static void pnv_chip_power8_instance_init(Object *obj) object_initialize_child(obj, "homer", &chip8->homer, TYPE_PNV8_HOMER); if (defaults_enabled()) { - chip->num_phbs = pcc->num_phbs; + chip8->num_phbs = pcc->num_phbs; } - for (i = 0; i < chip->num_phbs; i++) { + for (i = 0; i < chip8->num_phbs; i++) { object_initialize_child(obj, "phb[*]", &chip8->phbs[i], TYPE_PNV_PHB3); } @@ -1247,7 +1246,7 @@ static void pnv_chip_power8_realize(DeviceState *dev, Error **errp) &chip8->homer.regs); /* PHB3 controllers */ - for (i = 0; i < chip->num_phbs; i++) { + for (i = 0; i < chip8->num_phbs; i++) { PnvPHB3 *phb = &chip8->phbs[i]; object_property_set_int(OBJECT(phb), "index", i, &error_fatal); From patchwork Wed Jan 12 11:55:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711365 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3217AC433EF for ; Wed, 12 Jan 2022 13:07:40 +0000 (UTC) Received: from localhost ([::1]:52930 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dLn-0002WN-5F for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:07:39 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60718) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEz-0006X5-2l; Wed, 12 Jan 2022 06:56:34 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:31192) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEw-0007Xa-E2; Wed, 12 Jan 2022 06:56:32 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAefMt017139; Wed, 12 Jan 2022 11:56:25 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0u8m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:25 +0000 Received: from m0098396.ppops.net (m0098396.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBgK7R029301; Wed, 12 Jan 2022 11:56:25 GMT Received: from ppma03fra.de.ibm.com (6b.4a.5195.ip4.static.sl-reverse.com [149.81.74.107]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0u77-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:24 +0000 Received: from pps.filterd (ppma03fra.de.ibm.com [127.0.0.1]) by ppma03fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmHLW022853; Wed, 12 Jan 2022 11:56:22 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma03fra.de.ibm.com with ESMTP id 3df289h0yf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:22 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuKZ739518518 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:20 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D7C71A4EC1; Wed, 12 Jan 2022 11:56:19 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9C315A4EBA; Wed, 12 Jan 2022 11:56:19 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:19 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id E0FA12201C6; Wed, 12 Jan 2022 12:56:18 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 25/34] pnv_phb3.h: change TYPE_PNV_PHB3_ROOT_BUS name Date: Wed, 12 Jan 2022 12:55:42 +0100 Message-Id: <20220112115551.987666-26-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: MZTBHDkkEvlnQ_t6BwdXMEjazU6ZEMyi X-Proofpoint-GUID: PCB9zVQLQi_EUMy7xAwImambh6aBpPSL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 mlxlogscore=999 malwarescore=0 bulkscore=0 clxscore=1034 priorityscore=1501 phishscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 mlxscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza The TYPE_PNV_PHB3_ROOT_BUS name is used as the default bus name when the dev has no 'id'. However, pnv-phb3-root-bus is a bit too long to be used as a bus name. Most common QEMU buses and PCI controllers are named based on their bus type (e.g. pSeries spapr-pci-host-bridge is called 'pci'). The most common name for a PCIE bus controller in QEMU is 'pcie'. Naming it 'pcie' would break the documented use of the pnv-phb3 device, since 'pcie.0' would now refer to the root bus instead of the first root port. There's nothing particularly wrong with the 'root-bus' name used before, aside from the fact that 'root-bus' is being used for pnv-phb3 and pnv-phb4 created buses, which is not quite correct since these buses aren't implemented the same way in QEMU - you can't plug a pnv-phb4-root-port into a pnv-phb3 root bus, for example. This patch renames it as 'pnv-phb3-root', which is a compromise between the existing and the previously used name. Creating 3 phbs without ID will result in an "info qtree" output similar to this: bus: main-system-bus type System dev: pnv-phb3, id "" index = 2 (0x2) chip-id = 0 (0x0) x-config-reg-migration-enabled = true bypass-iommu = false bus: pnv-phb3-root.2 type pnv-phb3-root (...) dev: pnv-phb3, id "" index = 1 (0x1) chip-id = 0 (0x0) x-config-reg-migration-enabled = true bypass-iommu = false bus: pnv-phb3-root.1 type pnv-phb3-root (...) dev: pnv-phb3, id "" index = 0 (0x0) chip-id = 0 (0x0) x-config-reg-migration-enabled = true bypass-iommu = false bus: pnv-phb3-root.0 type pnv-phb3-root Signed-off-by: Daniel Henrique Barboza Message-Id: <20220105212338.49899-11-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/pci-host/pnv_phb3.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/hw/pci-host/pnv_phb3.h b/include/hw/pci-host/pnv_phb3.h index 2e423c3890bc..af6ec83cf6cc 100644 --- a/include/hw/pci-host/pnv_phb3.h +++ b/include/hw/pci-host/pnv_phb3.h @@ -105,7 +105,7 @@ struct PnvPBCQState { /* * PHB3 PCIe Root port */ -#define TYPE_PNV_PHB3_ROOT_BUS "pnv-phb3-root-bus" +#define TYPE_PNV_PHB3_ROOT_BUS "pnv-phb3-root" #define TYPE_PNV_PHB3_ROOT_PORT "pnv-phb3-root-port" From patchwork Wed Jan 12 11:55:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711356 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 63FD2C433F5 for ; Wed, 12 Jan 2022 12:54:19 +0000 (UTC) Received: from localhost ([::1]:38732 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7d8s-0007Es-Cj for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:54:18 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60918) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFM-00074r-UH; Wed, 12 Jan 2022 06:56:56 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:55714) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFI-0007YR-Eg; Wed, 12 Jan 2022 06:56:54 -0500 Received: from pps.filterd (m0098410.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAuV7h006882; Wed, 12 Jan 2022 11:56:27 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhwp723py-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:27 +0000 Received: from m0098410.ppops.net (m0098410.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBuRXl028056; Wed, 12 Jan 2022 11:56:27 GMT Received: from ppma04ams.nl.ibm.com (63.31.33a9.ip4.static.sl-reverse.com [169.51.49.99]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhwp723n7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:27 +0000 Received: from pps.filterd (ppma04ams.nl.ibm.com [127.0.0.1]) by ppma04ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBl0N9018324; Wed, 12 Jan 2022 11:56:24 GMT Received: from b06cxnps4074.portsmouth.uk.ibm.com (d06relay11.portsmouth.uk.ibm.com [9.149.109.196]) by ppma04ams.nl.ibm.com with ESMTP id 3df289ap3h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:24 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps4074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuLwh44106178 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:21 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7EF3E11C064; Wed, 12 Jan 2022 11:56:20 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 469E011C09D; Wed, 12 Jan 2022 11:56:20 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:20 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 8BD9622016C; Wed, 12 Jan 2022 12:56:19 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 26/34] pnv_phb4.c: change TYPE_PNV_PHB4_ROOT_BUS name Date: Wed, 12 Jan 2022 12:55:43 +0100 Message-Id: <20220112115551.987666-27-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: KfMKHOaLeDnZPHQma0koEDeoHtkHKnLM X-Proofpoint-ORIG-GUID: LhLoUHcQt5OcCNm5nk8_Ng2eyLNzkGeI X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 adultscore=0 clxscore=1034 priorityscore=1501 malwarescore=0 phishscore=0 lowpriorityscore=0 impostorscore=0 mlxscore=0 mlxlogscore=999 spamscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Similar to what was happening with pnv-phb3 buses, TYPE_PNV_PHB4_ROOT_BUS set to "pnv-phb4-root-bus" is a bit too long for a default root bus name. The usual default name for theses buses in QEMU are 'pcie', but we want to make a distinction between pnv-phb4 buses and other PCIE buses, at least as far as default name goes, because not all PCIE devices are attachable to a pnv-phb4 root-bus type. Changing the default to 'pnv-phb4-root' allow us to have a shorter name while making this bus distinct, and the user can always set its own bus naming via the "id" attribute anyway. This is the 'info qtree' output after this change, using a powernv9 domain with 2 sockets and default settings enabled: qemu-system-ppc64 -m 4G -machine powernv9,accel=tcg \ -smp 2,sockets=2,cores=1,threads=1 dev: pnv-phb4, id "" index = 5 (0x5) chip-id = 1 (0x1) version = 704374636546 (0xa400000002) device-id = 1217 (0x4c1) x-config-reg-migration-enabled = true bypass-iommu = false bus: pnv-phb4-root.11 type pnv-phb4-root dev: pnv-phb4-root-port, id "" (...) dev: pnv-phb4, id "" index = 0 (0x0) chip-id = 1 (0x1) version = 704374636546 (0xa400000002) device-id = 1217 (0x4c1) x-config-reg-migration-enabled = true bypass-iommu = false bus: pnv-phb4-root.6 type pnv-phb4-root dev: pnv-phb4-root-port, id "" (..) dev: pnv-phb4, id "" index = 5 (0x5) chip-id = 0 (0x0) version = 704374636546 (0xa400000002) device-id = 1217 (0x4c1) x-config-reg-migration-enabled = true bypass-iommu = false bus: pnv-phb4-root.5 type pnv-phb4-root dev: pnv-phb4-root-port, id "" (...) dev: pnv-phb4, id "" index = 0 (0x0) chip-id = 0 (0x0) version = 704374636546 (0xa400000002) device-id = 1217 (0x4c1) x-config-reg-migration-enabled = true bypass-iommu = false bus: pnv-phb4-root.0 type pnv-phb4-root dev: pnv-phb4-root-port, id "" Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220110143346.455901-11-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/pci-host/pnv_phb4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/hw/pci-host/pnv_phb4.h b/include/hw/pci-host/pnv_phb4.h index ea63df967678..88dc6abb1ca7 100644 --- a/include/hw/pci-host/pnv_phb4.h +++ b/include/hw/pci-host/pnv_phb4.h @@ -46,7 +46,7 @@ typedef struct PnvPhb4DMASpace { /* * PHB4 PCIe Root port */ -#define TYPE_PNV_PHB4_ROOT_BUS "pnv-phb4-root-bus" +#define TYPE_PNV_PHB4_ROOT_BUS "pnv-phb4-root" #define TYPE_PNV_PHB4_ROOT_PORT "pnv-phb4-root-port" typedef struct PnvPHB4RootPort { From patchwork Wed Jan 12 11:55:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711357 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 09E63C433EF for ; Wed, 12 Jan 2022 12:57:01 +0000 (UTC) Received: from localhost ([::1]:40992 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dBT-0000Rr-UU for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:57:00 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60754) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cF0-0006Ya-9M; Wed, 12 Jan 2022 06:56:36 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:41316) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cEy-0007YH-ES; Wed, 12 Jan 2022 06:56:33 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBPFTG013867; Wed, 12 Jan 2022 11:56:27 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhv9qvdn2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:27 +0000 Received: from m0098394.ppops.net (m0098394.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBiA4T018476; Wed, 12 Jan 2022 11:56:26 GMT Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhv9qvdkp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:26 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBnGbb025517; Wed, 12 Jan 2022 11:56:24 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma06ams.nl.ibm.com with ESMTP id 3df1vjas86-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:24 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBlI9121627264 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:47:18 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 347B1A4ED8; Wed, 12 Jan 2022 11:56:21 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id E5CF1A4EDF; Wed, 12 Jan 2022 11:56:20 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:20 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 374D42201C6; Wed, 12 Jan 2022 12:56:20 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 27/34] pnv_phb4_pec.c: move pnv_pec_phb_offset() to pnv_phb4.c Date: Wed, 12 Jan 2022 12:55:44 +0100 Message-Id: <20220112115551.987666-28-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: -Wv7OEHtkONWJRPuKEs5nQIjNp0q-tQh X-Proofpoint-ORIG-GUID: xErXL4ylV268z5cmwnlbg2S-txMyIVXn X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 bulkscore=0 phishscore=0 clxscore=1034 suspectscore=0 malwarescore=0 priorityscore=1501 mlxlogscore=999 mlxscore=0 adultscore=0 lowpriorityscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza The logic inside pnv_pec_phb_offset() will be useful in the next patch to determine the stack that should contain a PHB4 device. Move the function to pnv_phb4.c and make it public since there's no pnv_phb4_pec.h header. While we're at it, add 'stack_index' as a parameter and make the function return 'phb-id' directly. And rename it to pnv_phb4_pec_get_phb_id() to be even clearer about the function intent. Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220110143346.455901-3-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/pci-host/pnv_phb4.h | 2 ++ hw/pci-host/pnv_phb4.c | 17 +++++++++++++++++ hw/pci-host/pnv_phb4_pec.c | 15 +-------------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/include/hw/pci-host/pnv_phb4.h b/include/hw/pci-host/pnv_phb4.h index 88dc6abb1ca7..5ee996ebc650 100644 --- a/include/hw/pci-host/pnv_phb4.h +++ b/include/hw/pci-host/pnv_phb4.h @@ -15,6 +15,7 @@ #include "hw/ppc/xive.h" #include "qom/object.h" +typedef struct PnvPhb4PecState PnvPhb4PecState; typedef struct PnvPhb4PecStack PnvPhb4PecStack; typedef struct PnvPHB4 PnvPHB4; typedef struct PnvChip PnvChip; @@ -131,6 +132,7 @@ struct PnvPHB4 { void pnv_phb4_pic_print_info(PnvPHB4 *phb, Monitor *mon); void pnv_phb4_update_regions(PnvPhb4PecStack *stack); +int pnv_phb4_pec_get_phb_id(PnvPhb4PecState *pec, int stack_index); extern const MemoryRegionOps pnv_phb4_xscom_ops; /* diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index 83dedc878a57..2223b985b269 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -1069,6 +1069,23 @@ static const TypeInfo pnv_phb4_iommu_memory_region_info = { .class_init = pnv_phb4_iommu_memory_region_class_init, }; +/* + * Return the index/phb-id of a PHB4 that belongs to a + * pec->stacks[stack_index] stack. + */ +int pnv_phb4_pec_get_phb_id(PnvPhb4PecState *pec, int stack_index) +{ + PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec); + int index = pec->index; + int offset = 0; + + while (index--) { + offset += pecc->num_stacks[index]; + } + + return offset + stack_index; +} + /* * MSI/MSIX memory region implementation. * The handler handles both MSI and MSIX. diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c index f3e4fa0c8297..49360de8c858 100644 --- a/hw/pci-host/pnv_phb4_pec.c +++ b/hw/pci-host/pnv_phb4_pec.c @@ -374,19 +374,6 @@ static void pnv_pec_instance_init(Object *obj) } } -static int pnv_pec_phb_offset(PnvPhb4PecState *pec) -{ - PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec); - int index = pec->index; - int offset = 0; - - while (index--) { - offset += pecc->num_stacks[index]; - } - - return offset; -} - static void pnv_pec_realize(DeviceState *dev, Error **errp) { PnvPhb4PecState *pec = PNV_PHB4_PEC(dev); @@ -405,7 +392,7 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp) for (i = 0; i < pec->num_stacks; i++) { PnvPhb4PecStack *stack = &pec->stacks[i]; Object *stk_obj = OBJECT(stack); - int phb_id = pnv_pec_phb_offset(pec) + i; + int phb_id = pnv_phb4_pec_get_phb_id(pec, i); object_property_set_int(stk_obj, "stack-no", i, &error_abort); object_property_set_int(stk_obj, "phb-id", phb_id, &error_abort); From patchwork Wed Jan 12 11:55:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711401 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 41FB8C433EF for ; Wed, 12 Jan 2022 13:43:52 +0000 (UTC) Received: from localhost ([::1]:43236 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dup-0004yS-BF for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:43:51 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60942) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFO-0007AI-6M; Wed, 12 Jan 2022 06:56:58 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:48496 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFL-0007aA-OR; Wed, 12 Jan 2022 06:56:57 -0500 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAOH7w017217; Wed, 12 Jan 2022 11:56:26 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhtkr6f42-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:26 +0000 Received: from m0098413.ppops.net (m0098413.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBSWul019831; Wed, 12 Jan 2022 11:56:26 GMT Received: from ppma04fra.de.ibm.com (6a.4a.5195.ip4.static.sl-reverse.com [149.81.74.106]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhtkr6f30-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:26 +0000 Received: from pps.filterd (ppma04fra.de.ibm.com [127.0.0.1]) by ppma04fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmI3Q018118; Wed, 12 Jan 2022 11:56:24 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma04fra.de.ibm.com with ESMTP id 3df289s27g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:24 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuL6134996544 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:22 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BE9A852067; Wed, 12 Jan 2022 11:56:21 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av21.portsmouth.uk.ibm.com (Postfix) with SMTP id 866B65204E; Wed, 12 Jan 2022 11:56:21 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id D6F9C22016C; Wed, 12 Jan 2022 12:56:20 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 28/34] pnv_phb4_pec: use pnv_phb4_pec_get_phb_id() in pnv_pec_dt_xscom() Date: Wed, 12 Jan 2022 12:55:45 +0100 Message-Id: <20220112115551.987666-29-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: dNfXzFZYpr--Q_hs5JfmVHsZrr1Ia1f3 X-Proofpoint-ORIG-GUID: aGXommBHNCN1HNMjPqnE4GJsHSqTJfNa X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 mlxlogscore=999 clxscore=1034 spamscore=0 phishscore=0 bulkscore=0 priorityscore=1501 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Relying on stack->phb to write the xscom DT of the PEC is something that we won't be able to do with user creatable pnv-phb4 devices. Hopefully, this can be done by using pnv_phb4_pec_get_phb_id(), which is already used by pnv_pec_realize() to set the phb-id of the stack. Use the same idea in pnv_pec_dt_xscom() to write ibm,phb-index without the need to accessing stack->phb, since stack->phb is not granted to be != NULL when user creatable phbs are introduced. Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220110143346.455901-4-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb4_pec.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c index 49360de8c858..d64310e7db1e 100644 --- a/hw/pci-host/pnv_phb4_pec.c +++ b/hw/pci-host/pnv_phb4_pec.c @@ -449,8 +449,7 @@ static int pnv_pec_dt_xscom(PnvXScomInterface *dev, void *fdt, pecc->compat_size))); for (i = 0; i < pec->num_stacks; i++) { - PnvPhb4PecStack *stack = &pec->stacks[i]; - PnvPHB4 *phb = &stack->phb; + int phb_id = pnv_phb4_pec_get_phb_id(pec, i); int stk_offset; name = g_strdup_printf("stack@%x", i); @@ -460,7 +459,7 @@ static int pnv_pec_dt_xscom(PnvXScomInterface *dev, void *fdt, _FDT((fdt_setprop(fdt, stk_offset, "compatible", pecc->stk_compat, pecc->stk_compat_size))); _FDT((fdt_setprop_cell(fdt, stk_offset, "reg", i))); - _FDT((fdt_setprop_cell(fdt, stk_offset, "ibm,phb-index", phb->phb_id))); + _FDT((fdt_setprop_cell(fdt, stk_offset, "ibm,phb-index", phb_id))); } return 0; From patchwork Wed Jan 12 11:55:46 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711344 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id F0B17C433EF for ; Wed, 12 Jan 2022 12:39:32 +0000 (UTC) Received: from localhost ([::1]:57766 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7cuZ-0008Gi-Uh for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 07:39:31 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60858) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFJ-00073Y-TP; Wed, 12 Jan 2022 06:56:56 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:57500 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFI-0007YL-DR; Wed, 12 Jan 2022 06:56:53 -0500 Received: from pps.filterd (m0098419.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CBLM6a019354; Wed, 12 Jan 2022 11:56:29 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhx1us83w-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:28 +0000 Received: from m0098419.ppops.net (m0098419.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBgl8W027243; Wed, 12 Jan 2022 11:56:28 GMT Received: from ppma04fra.de.ibm.com (6a.4a.5195.ip4.static.sl-reverse.com [149.81.74.106]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhx1us834-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:28 +0000 Received: from pps.filterd (ppma04fra.de.ibm.com [127.0.0.1]) by ppma04fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmI3W018118; Wed, 12 Jan 2022 11:56:26 GMT Received: from b06avi18626390.portsmouth.uk.ibm.com (b06avi18626390.portsmouth.uk.ibm.com [9.149.26.192]) by ppma04fra.de.ibm.com with ESMTP id 3df289s284-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:26 +0000 Received: from d06av26.portsmouth.uk.ibm.com (d06av26.portsmouth.uk.ibm.com [9.149.105.62]) by b06avi18626390.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBlKFj12976538 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:47:20 GMT Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7CF48AE080; Wed, 12 Jan 2022 11:56:22 +0000 (GMT) Received: from d06av26.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 3A693AE076; Wed, 12 Jan 2022 11:56:22 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av26.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:22 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 810DA2201C6; Wed, 12 Jan 2022 12:56:21 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 29/34] ppc/pnv: set phb4 properties in stk_realize() Date: Wed, 12 Jan 2022 12:55:46 +0100 Message-Id: <20220112115551.987666-30-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: yheWGtXyioxGXrHqcorhTcg_XlU45rKZ X-Proofpoint-ORIG-GUID: CGpP-utUIjjhQI3Q6gR8GpXZ0COETC4M X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 impostorscore=0 clxscore=1034 phishscore=0 priorityscore=1501 mlxlogscore=974 malwarescore=0 spamscore=0 adultscore=0 lowpriorityscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Moving all phb4 properties setup to stk_realize() keeps this logic in a single place instead of having it scattered between stk_realize() and pec_realize(). 'phb->index' can be retrieved using stack->stack_no and pnv_phb4_pec_get_phb_id(), deprecating the use of 'phb-id' alias that was being used for this purpose in pec_realize(). Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220111131027.599784-2-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb4_pec.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c index d64310e7db1e..f8038dff171c 100644 --- a/hw/pci-host/pnv_phb4_pec.c +++ b/hw/pci-host/pnv_phb4_pec.c @@ -392,10 +392,8 @@ static void pnv_pec_realize(DeviceState *dev, Error **errp) for (i = 0; i < pec->num_stacks; i++) { PnvPhb4PecStack *stack = &pec->stacks[i]; Object *stk_obj = OBJECT(stack); - int phb_id = pnv_phb4_pec_get_phb_id(pec, i); object_property_set_int(stk_obj, "stack-no", i, &error_abort); - object_property_set_int(stk_obj, "phb-id", phb_id, &error_abort); object_property_set_link(stk_obj, "pec", OBJECT(pec), &error_abort); if (!qdev_realize(DEVICE(stk_obj), NULL, errp)) { return; @@ -534,7 +532,6 @@ static void pnv_pec_stk_instance_init(Object *obj) PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(obj); object_initialize_child(obj, "phb", &stack->phb, TYPE_PNV_PHB4); - object_property_add_alias(obj, "phb-id", OBJECT(&stack->phb), "index"); } static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) @@ -543,6 +540,7 @@ static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) PnvPhb4PecState *pec = stack->pec; PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec); PnvChip *chip = pec->chip; + int phb_id = pnv_phb4_pec_get_phb_id(pec, stack->stack_no); uint32_t pec_nest_base; uint32_t pec_pci_base; char name[64]; @@ -570,6 +568,8 @@ static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) object_property_set_int(OBJECT(&stack->phb), "chip-id", pec->chip_id, &error_fatal); + object_property_set_int(OBJECT(&stack->phb), "index", phb_id, + &error_fatal); object_property_set_int(OBJECT(&stack->phb), "version", pecc->version, &error_fatal); object_property_set_link(OBJECT(&stack->phb), "stack", OBJECT(stack), From patchwork Wed Jan 12 11:55:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711425 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 23727C433F5 for ; Wed, 12 Jan 2022 13:54:16 +0000 (UTC) Received: from localhost ([::1]:60912 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7e4t-0000zM-4W for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:54:15 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60974) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFR-0007Kr-Sm; Wed, 12 Jan 2022 06:57:03 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:30564) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFP-0007c9-1Y; Wed, 12 Jan 2022 06:57:01 -0500 Received: from pps.filterd (m0098399.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAZtwN005046; Wed, 12 Jan 2022 11:56:29 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhhcwfx12-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:29 +0000 Received: from m0098399.ppops.net (m0098399.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CB7PB3017224; Wed, 12 Jan 2022 11:56:28 GMT Received: from ppma05fra.de.ibm.com (6c.4a.5195.ip4.static.sl-reverse.com [149.81.74.108]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhhcwfwy2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:28 +0000 Received: from pps.filterd (ppma05fra.de.ibm.com [127.0.0.1]) by ppma05fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmRm9031226; Wed, 12 Jan 2022 11:56:26 GMT Received: from b06cxnps3074.portsmouth.uk.ibm.com (d06relay09.portsmouth.uk.ibm.com [9.149.109.194]) by ppma05fra.de.ibm.com with ESMTP id 3df289h2xw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:26 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps3074.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuN8c46006708 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:23 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 33AEDA4EDC; Wed, 12 Jan 2022 11:56:23 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D978AA4ECC; Wed, 12 Jan 2022 11:56:22 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:22 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 2C2B022016C; Wed, 12 Jan 2022 12:56:22 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 30/34] ppc/pnv: move PHB4 XSCOM init to phb4_realize() Date: Wed, 12 Jan 2022 12:55:47 +0100 Message-Id: <20220112115551.987666-31-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: g5kO4qNNiusabBpXf9BW5BCt8-9WPc_F X-Proofpoint-ORIG-GUID: -Q4c_KQMKzIAVkwpLTJKUT3nGI7QmAMh X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 bulkscore=0 spamscore=0 clxscore=1034 phishscore=0 impostorscore=0 priorityscore=1501 adultscore=0 mlxscore=0 lowpriorityscore=0 suspectscore=0 mlxlogscore=999 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza The 'stack->phb_regs_mr' PHB4 passthrough XSCOM initialization relies on 'stack->phb' being not NULL. Moving 'stack->phb_regs_mr' region_init() and add_subregion() to phb4_realize() time is a natural thing to do since it's strictly PHB related. The remaining XSCOM initialization is also related to 'stack->phb' but in a different manner. For instance, 'stack->nest_regs_mr' MemoryRegionOps, 'pnv_pec_stk_nest_xscom_ops', uses pnv_pec_stk_nest_xscom_write() as a write callback. When trying to write the PEC_NEST_STK_BAR_EN reg, pnv_pec_stk_update_map() is called. Inside this function, pnv_phb4_update_regions() is called twice. This function uses 'stack->phb' to manipulate memory regions of the phb. This is not a problem now but, when enabling user creatable phb4s, a stack that doesn't have an associated phb (i.e. stack->phb = NULL) it will cause a SIGINT during boot in pnv_phb4_update_regions(). All this can be avoided if all XSCOM realize is moved to phb4_realize(), when we have certainty about the existence of 'stack->phb'. A lot of code was moved from pnv_phb4_pec.c to pnv_phb4.c due to static constant and variables being used but the cleaner logic is worth the trouble. Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220111131027.599784-3-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb4.c | 304 +++++++++++++++++++++++++++++++++++++ hw/pci-host/pnv_phb4_pec.c | 292 ----------------------------------- 2 files changed, 304 insertions(+), 292 deletions(-) diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index 2223b985b269..8ef58bf2de7a 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -29,6 +29,10 @@ qemu_log_mask(LOG_GUEST_ERROR, "phb4[%d:%d]: " fmt "\n", \ (phb)->chip_id, (phb)->phb_id, ## __VA_ARGS__) +#define phb_pec_error(pec, fmt, ...) \ + qemu_log_mask(LOG_GUEST_ERROR, "phb4_pec[%d:%d]: " fmt "\n", \ + (pec)->chip_id, (pec)->index, ## __VA_ARGS__) + /* * QEMU version of the GETFIELD/SETFIELD macros * @@ -854,6 +858,258 @@ const MemoryRegionOps pnv_phb4_xscom_ops = { .endianness = DEVICE_BIG_ENDIAN, }; +static uint64_t pnv_pec_stk_nest_xscom_read(void *opaque, hwaddr addr, + unsigned size) +{ + PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); + uint32_t reg = addr >> 3; + + /* TODO: add list of allowed registers and error out if not */ + return stack->nest_regs[reg]; +} + +static void pnv_pec_stk_update_map(PnvPhb4PecStack *stack) +{ + PnvPhb4PecState *pec = stack->pec; + MemoryRegion *sysmem = get_system_memory(); + uint64_t bar_en = stack->nest_regs[PEC_NEST_STK_BAR_EN]; + uint64_t bar, mask, size; + char name[64]; + + /* + * NOTE: This will really not work well if those are remapped + * after the PHB has created its sub regions. We could do better + * if we had a way to resize regions but we don't really care + * that much in practice as the stuff below really only happens + * once early during boot + */ + + /* Handle unmaps */ + if (memory_region_is_mapped(&stack->mmbar0) && + !(bar_en & PEC_NEST_STK_BAR_EN_MMIO0)) { + memory_region_del_subregion(sysmem, &stack->mmbar0); + } + if (memory_region_is_mapped(&stack->mmbar1) && + !(bar_en & PEC_NEST_STK_BAR_EN_MMIO1)) { + memory_region_del_subregion(sysmem, &stack->mmbar1); + } + if (memory_region_is_mapped(&stack->phbbar) && + !(bar_en & PEC_NEST_STK_BAR_EN_PHB)) { + memory_region_del_subregion(sysmem, &stack->phbbar); + } + if (memory_region_is_mapped(&stack->intbar) && + !(bar_en & PEC_NEST_STK_BAR_EN_INT)) { + memory_region_del_subregion(sysmem, &stack->intbar); + } + + /* Update PHB */ + pnv_phb4_update_regions(stack); + + /* Handle maps */ + if (!memory_region_is_mapped(&stack->mmbar0) && + (bar_en & PEC_NEST_STK_BAR_EN_MMIO0)) { + bar = stack->nest_regs[PEC_NEST_STK_MMIO_BAR0] >> 8; + mask = stack->nest_regs[PEC_NEST_STK_MMIO_BAR0_MASK]; + size = ((~mask) >> 8) + 1; + snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-mmio0", + pec->chip_id, pec->index, stack->stack_no); + memory_region_init(&stack->mmbar0, OBJECT(stack), name, size); + memory_region_add_subregion(sysmem, bar, &stack->mmbar0); + stack->mmio0_base = bar; + stack->mmio0_size = size; + } + if (!memory_region_is_mapped(&stack->mmbar1) && + (bar_en & PEC_NEST_STK_BAR_EN_MMIO1)) { + bar = stack->nest_regs[PEC_NEST_STK_MMIO_BAR1] >> 8; + mask = stack->nest_regs[PEC_NEST_STK_MMIO_BAR1_MASK]; + size = ((~mask) >> 8) + 1; + snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-mmio1", + pec->chip_id, pec->index, stack->stack_no); + memory_region_init(&stack->mmbar1, OBJECT(stack), name, size); + memory_region_add_subregion(sysmem, bar, &stack->mmbar1); + stack->mmio1_base = bar; + stack->mmio1_size = size; + } + if (!memory_region_is_mapped(&stack->phbbar) && + (bar_en & PEC_NEST_STK_BAR_EN_PHB)) { + bar = stack->nest_regs[PEC_NEST_STK_PHB_REGS_BAR] >> 8; + size = PNV_PHB4_NUM_REGS << 3; + snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-phb", + pec->chip_id, pec->index, stack->stack_no); + memory_region_init(&stack->phbbar, OBJECT(stack), name, size); + memory_region_add_subregion(sysmem, bar, &stack->phbbar); + } + if (!memory_region_is_mapped(&stack->intbar) && + (bar_en & PEC_NEST_STK_BAR_EN_INT)) { + bar = stack->nest_regs[PEC_NEST_STK_INT_BAR] >> 8; + size = PNV_PHB4_MAX_INTs << 16; + snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-int", + stack->pec->chip_id, stack->pec->index, stack->stack_no); + memory_region_init(&stack->intbar, OBJECT(stack), name, size); + memory_region_add_subregion(sysmem, bar, &stack->intbar); + } + + /* Update PHB */ + pnv_phb4_update_regions(stack); +} + +static void pnv_pec_stk_nest_xscom_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); + PnvPhb4PecState *pec = stack->pec; + uint32_t reg = addr >> 3; + + switch (reg) { + case PEC_NEST_STK_PCI_NEST_FIR: + stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR] = val; + break; + case PEC_NEST_STK_PCI_NEST_FIR_CLR: + stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR] &= val; + break; + case PEC_NEST_STK_PCI_NEST_FIR_SET: + stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR] |= val; + break; + case PEC_NEST_STK_PCI_NEST_FIR_MSK: + stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR_MSK] = val; + break; + case PEC_NEST_STK_PCI_NEST_FIR_MSKC: + stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR_MSK] &= val; + break; + case PEC_NEST_STK_PCI_NEST_FIR_MSKS: + stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR_MSK] |= val; + break; + case PEC_NEST_STK_PCI_NEST_FIR_ACT0: + case PEC_NEST_STK_PCI_NEST_FIR_ACT1: + stack->nest_regs[reg] = val; + break; + case PEC_NEST_STK_PCI_NEST_FIR_WOF: + stack->nest_regs[reg] = 0; + break; + case PEC_NEST_STK_ERR_REPORT_0: + case PEC_NEST_STK_ERR_REPORT_1: + case PEC_NEST_STK_PBCQ_GNRL_STATUS: + /* Flag error ? */ + break; + case PEC_NEST_STK_PBCQ_MODE: + stack->nest_regs[reg] = val & 0xff00000000000000ull; + break; + case PEC_NEST_STK_MMIO_BAR0: + case PEC_NEST_STK_MMIO_BAR0_MASK: + case PEC_NEST_STK_MMIO_BAR1: + case PEC_NEST_STK_MMIO_BAR1_MASK: + if (stack->nest_regs[PEC_NEST_STK_BAR_EN] & + (PEC_NEST_STK_BAR_EN_MMIO0 | + PEC_NEST_STK_BAR_EN_MMIO1)) { + phb_pec_error(pec, "Changing enabled BAR unsupported\n"); + } + stack->nest_regs[reg] = val & 0xffffffffff000000ull; + break; + case PEC_NEST_STK_PHB_REGS_BAR: + if (stack->nest_regs[PEC_NEST_STK_BAR_EN] & PEC_NEST_STK_BAR_EN_PHB) { + phb_pec_error(pec, "Changing enabled BAR unsupported\n"); + } + stack->nest_regs[reg] = val & 0xffffffffffc00000ull; + break; + case PEC_NEST_STK_INT_BAR: + if (stack->nest_regs[PEC_NEST_STK_BAR_EN] & PEC_NEST_STK_BAR_EN_INT) { + phb_pec_error(pec, "Changing enabled BAR unsupported\n"); + } + stack->nest_regs[reg] = val & 0xfffffff000000000ull; + break; + case PEC_NEST_STK_BAR_EN: + stack->nest_regs[reg] = val & 0xf000000000000000ull; + pnv_pec_stk_update_map(stack); + break; + case PEC_NEST_STK_DATA_FRZ_TYPE: + case PEC_NEST_STK_PBCQ_TUN_BAR: + /* Not used for now */ + stack->nest_regs[reg] = val; + break; + default: + qemu_log_mask(LOG_UNIMP, "phb4_pec: nest_xscom_write 0x%"HWADDR_PRIx + "=%"PRIx64"\n", addr, val); + } +} + +static const MemoryRegionOps pnv_pec_stk_nest_xscom_ops = { + .read = pnv_pec_stk_nest_xscom_read, + .write = pnv_pec_stk_nest_xscom_write, + .valid.min_access_size = 8, + .valid.max_access_size = 8, + .impl.min_access_size = 8, + .impl.max_access_size = 8, + .endianness = DEVICE_BIG_ENDIAN, +}; + +static uint64_t pnv_pec_stk_pci_xscom_read(void *opaque, hwaddr addr, + unsigned size) +{ + PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); + uint32_t reg = addr >> 3; + + /* TODO: add list of allowed registers and error out if not */ + return stack->pci_regs[reg]; +} + +static void pnv_pec_stk_pci_xscom_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); + uint32_t reg = addr >> 3; + + switch (reg) { + case PEC_PCI_STK_PCI_FIR: + stack->nest_regs[reg] = val; + break; + case PEC_PCI_STK_PCI_FIR_CLR: + stack->nest_regs[PEC_PCI_STK_PCI_FIR] &= val; + break; + case PEC_PCI_STK_PCI_FIR_SET: + stack->nest_regs[PEC_PCI_STK_PCI_FIR] |= val; + break; + case PEC_PCI_STK_PCI_FIR_MSK: + stack->nest_regs[reg] = val; + break; + case PEC_PCI_STK_PCI_FIR_MSKC: + stack->nest_regs[PEC_PCI_STK_PCI_FIR_MSK] &= val; + break; + case PEC_PCI_STK_PCI_FIR_MSKS: + stack->nest_regs[PEC_PCI_STK_PCI_FIR_MSK] |= val; + break; + case PEC_PCI_STK_PCI_FIR_ACT0: + case PEC_PCI_STK_PCI_FIR_ACT1: + stack->nest_regs[reg] = val; + break; + case PEC_PCI_STK_PCI_FIR_WOF: + stack->nest_regs[reg] = 0; + break; + case PEC_PCI_STK_ETU_RESET: + stack->nest_regs[reg] = val & 0x8000000000000000ull; + /* TODO: Implement reset */ + break; + case PEC_PCI_STK_PBAIB_ERR_REPORT: + break; + case PEC_PCI_STK_PBAIB_TX_CMD_CRED: + case PEC_PCI_STK_PBAIB_TX_DAT_CRED: + stack->nest_regs[reg] = val; + break; + default: + qemu_log_mask(LOG_UNIMP, "phb4_pec_stk: pci_xscom_write 0x%"HWADDR_PRIx + "=%"PRIx64"\n", addr, val); + } +} + +static const MemoryRegionOps pnv_pec_stk_pci_xscom_ops = { + .read = pnv_pec_stk_pci_xscom_read, + .write = pnv_pec_stk_pci_xscom_write, + .valid.min_access_size = 8, + .valid.max_access_size = 8, + .impl.min_access_size = 8, + .impl.max_access_size = 8, + .endianness = DEVICE_BIG_ENDIAN, +}; + static int pnv_phb4_map_irq(PCIDevice *pci_dev, int irq_num) { /* Check that out properly ... */ @@ -1175,6 +1431,52 @@ static AddressSpace *pnv_phb4_dma_iommu(PCIBus *bus, void *opaque, int devfn) return &ds->dma_as; } +static void pnv_phb4_xscom_realize(PnvPHB4 *phb) +{ + PnvPhb4PecStack *stack = phb->stack; + PnvPhb4PecState *pec = stack->pec; + PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec); + uint32_t pec_nest_base; + uint32_t pec_pci_base; + char name[64]; + + assert(pec); + + /* Initialize the XSCOM regions for the stack registers */ + snprintf(name, sizeof(name), "xscom-pec-%d.%d-nest-stack-%d", + pec->chip_id, pec->index, stack->stack_no); + pnv_xscom_region_init(&stack->nest_regs_mr, OBJECT(stack), + &pnv_pec_stk_nest_xscom_ops, stack, name, + PHB4_PEC_NEST_STK_REGS_COUNT); + + snprintf(name, sizeof(name), "xscom-pec-%d.%d-pci-stack-%d", + pec->chip_id, pec->index, stack->stack_no); + pnv_xscom_region_init(&stack->pci_regs_mr, OBJECT(stack), + &pnv_pec_stk_pci_xscom_ops, stack, name, + PHB4_PEC_PCI_STK_REGS_COUNT); + + /* PHB pass-through */ + snprintf(name, sizeof(name), "xscom-pec-%d.%d-pci-stack-%d-phb", + pec->chip_id, pec->index, stack->stack_no); + pnv_xscom_region_init(&stack->phb_regs_mr, OBJECT(phb), + &pnv_phb4_xscom_ops, phb, name, 0x40); + + pec_nest_base = pecc->xscom_nest_base(pec); + pec_pci_base = pecc->xscom_pci_base(pec); + + /* Populate the XSCOM address space. */ + pnv_xscom_add_subregion(pec->chip, + pec_nest_base + 0x40 * (stack->stack_no + 1), + &stack->nest_regs_mr); + pnv_xscom_add_subregion(pec->chip, + pec_pci_base + 0x40 * (stack->stack_no + 1), + &stack->pci_regs_mr); + pnv_xscom_add_subregion(pec->chip, + pec_pci_base + PNV9_XSCOM_PEC_PCI_STK0 + + 0x40 * stack->stack_no, + &stack->phb_regs_mr); +} + static void pnv_phb4_instance_init(Object *obj) { PnvPHB4 *phb = PNV_PHB4(obj); @@ -1247,6 +1549,8 @@ static void pnv_phb4_realize(DeviceState *dev, Error **errp) pnv_phb4_update_xsrc(phb); phb->qirqs = qemu_allocate_irqs(xive_source_set_irq, xsrc, xsrc->nr_irqs); + + pnv_phb4_xscom_realize(phb); } static const char *pnv_phb4_root_bus_path(PCIHostState *host_bridge, diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c index f8038dff171c..bf0fdf33fd8c 100644 --- a/hw/pci-host/pnv_phb4_pec.c +++ b/hw/pci-host/pnv_phb4_pec.c @@ -111,258 +111,6 @@ static const MemoryRegionOps pnv_pec_pci_xscom_ops = { .endianness = DEVICE_BIG_ENDIAN, }; -static uint64_t pnv_pec_stk_nest_xscom_read(void *opaque, hwaddr addr, - unsigned size) -{ - PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); - uint32_t reg = addr >> 3; - - /* TODO: add list of allowed registers and error out if not */ - return stack->nest_regs[reg]; -} - -static void pnv_pec_stk_update_map(PnvPhb4PecStack *stack) -{ - PnvPhb4PecState *pec = stack->pec; - MemoryRegion *sysmem = get_system_memory(); - uint64_t bar_en = stack->nest_regs[PEC_NEST_STK_BAR_EN]; - uint64_t bar, mask, size; - char name[64]; - - /* - * NOTE: This will really not work well if those are remapped - * after the PHB has created its sub regions. We could do better - * if we had a way to resize regions but we don't really care - * that much in practice as the stuff below really only happens - * once early during boot - */ - - /* Handle unmaps */ - if (memory_region_is_mapped(&stack->mmbar0) && - !(bar_en & PEC_NEST_STK_BAR_EN_MMIO0)) { - memory_region_del_subregion(sysmem, &stack->mmbar0); - } - if (memory_region_is_mapped(&stack->mmbar1) && - !(bar_en & PEC_NEST_STK_BAR_EN_MMIO1)) { - memory_region_del_subregion(sysmem, &stack->mmbar1); - } - if (memory_region_is_mapped(&stack->phbbar) && - !(bar_en & PEC_NEST_STK_BAR_EN_PHB)) { - memory_region_del_subregion(sysmem, &stack->phbbar); - } - if (memory_region_is_mapped(&stack->intbar) && - !(bar_en & PEC_NEST_STK_BAR_EN_INT)) { - memory_region_del_subregion(sysmem, &stack->intbar); - } - - /* Update PHB */ - pnv_phb4_update_regions(stack); - - /* Handle maps */ - if (!memory_region_is_mapped(&stack->mmbar0) && - (bar_en & PEC_NEST_STK_BAR_EN_MMIO0)) { - bar = stack->nest_regs[PEC_NEST_STK_MMIO_BAR0] >> 8; - mask = stack->nest_regs[PEC_NEST_STK_MMIO_BAR0_MASK]; - size = ((~mask) >> 8) + 1; - snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-mmio0", - pec->chip_id, pec->index, stack->stack_no); - memory_region_init(&stack->mmbar0, OBJECT(stack), name, size); - memory_region_add_subregion(sysmem, bar, &stack->mmbar0); - stack->mmio0_base = bar; - stack->mmio0_size = size; - } - if (!memory_region_is_mapped(&stack->mmbar1) && - (bar_en & PEC_NEST_STK_BAR_EN_MMIO1)) { - bar = stack->nest_regs[PEC_NEST_STK_MMIO_BAR1] >> 8; - mask = stack->nest_regs[PEC_NEST_STK_MMIO_BAR1_MASK]; - size = ((~mask) >> 8) + 1; - snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-mmio1", - pec->chip_id, pec->index, stack->stack_no); - memory_region_init(&stack->mmbar1, OBJECT(stack), name, size); - memory_region_add_subregion(sysmem, bar, &stack->mmbar1); - stack->mmio1_base = bar; - stack->mmio1_size = size; - } - if (!memory_region_is_mapped(&stack->phbbar) && - (bar_en & PEC_NEST_STK_BAR_EN_PHB)) { - bar = stack->nest_regs[PEC_NEST_STK_PHB_REGS_BAR] >> 8; - size = PNV_PHB4_NUM_REGS << 3; - snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-phb", - pec->chip_id, pec->index, stack->stack_no); - memory_region_init(&stack->phbbar, OBJECT(stack), name, size); - memory_region_add_subregion(sysmem, bar, &stack->phbbar); - } - if (!memory_region_is_mapped(&stack->intbar) && - (bar_en & PEC_NEST_STK_BAR_EN_INT)) { - bar = stack->nest_regs[PEC_NEST_STK_INT_BAR] >> 8; - size = PNV_PHB4_MAX_INTs << 16; - snprintf(name, sizeof(name), "pec-%d.%d-stack-%d-int", - stack->pec->chip_id, stack->pec->index, stack->stack_no); - memory_region_init(&stack->intbar, OBJECT(stack), name, size); - memory_region_add_subregion(sysmem, bar, &stack->intbar); - } - - /* Update PHB */ - pnv_phb4_update_regions(stack); -} - -static void pnv_pec_stk_nest_xscom_write(void *opaque, hwaddr addr, - uint64_t val, unsigned size) -{ - PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); - PnvPhb4PecState *pec = stack->pec; - uint32_t reg = addr >> 3; - - switch (reg) { - case PEC_NEST_STK_PCI_NEST_FIR: - stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR] = val; - break; - case PEC_NEST_STK_PCI_NEST_FIR_CLR: - stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR] &= val; - break; - case PEC_NEST_STK_PCI_NEST_FIR_SET: - stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR] |= val; - break; - case PEC_NEST_STK_PCI_NEST_FIR_MSK: - stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR_MSK] = val; - break; - case PEC_NEST_STK_PCI_NEST_FIR_MSKC: - stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR_MSK] &= val; - break; - case PEC_NEST_STK_PCI_NEST_FIR_MSKS: - stack->nest_regs[PEC_NEST_STK_PCI_NEST_FIR_MSK] |= val; - break; - case PEC_NEST_STK_PCI_NEST_FIR_ACT0: - case PEC_NEST_STK_PCI_NEST_FIR_ACT1: - stack->nest_regs[reg] = val; - break; - case PEC_NEST_STK_PCI_NEST_FIR_WOF: - stack->nest_regs[reg] = 0; - break; - case PEC_NEST_STK_ERR_REPORT_0: - case PEC_NEST_STK_ERR_REPORT_1: - case PEC_NEST_STK_PBCQ_GNRL_STATUS: - /* Flag error ? */ - break; - case PEC_NEST_STK_PBCQ_MODE: - stack->nest_regs[reg] = val & 0xff00000000000000ull; - break; - case PEC_NEST_STK_MMIO_BAR0: - case PEC_NEST_STK_MMIO_BAR0_MASK: - case PEC_NEST_STK_MMIO_BAR1: - case PEC_NEST_STK_MMIO_BAR1_MASK: - if (stack->nest_regs[PEC_NEST_STK_BAR_EN] & - (PEC_NEST_STK_BAR_EN_MMIO0 | - PEC_NEST_STK_BAR_EN_MMIO1)) { - phb_pec_error(pec, "Changing enabled BAR unsupported\n"); - } - stack->nest_regs[reg] = val & 0xffffffffff000000ull; - break; - case PEC_NEST_STK_PHB_REGS_BAR: - if (stack->nest_regs[PEC_NEST_STK_BAR_EN] & PEC_NEST_STK_BAR_EN_PHB) { - phb_pec_error(pec, "Changing enabled BAR unsupported\n"); - } - stack->nest_regs[reg] = val & 0xffffffffffc00000ull; - break; - case PEC_NEST_STK_INT_BAR: - if (stack->nest_regs[PEC_NEST_STK_BAR_EN] & PEC_NEST_STK_BAR_EN_INT) { - phb_pec_error(pec, "Changing enabled BAR unsupported\n"); - } - stack->nest_regs[reg] = val & 0xfffffff000000000ull; - break; - case PEC_NEST_STK_BAR_EN: - stack->nest_regs[reg] = val & 0xf000000000000000ull; - pnv_pec_stk_update_map(stack); - break; - case PEC_NEST_STK_DATA_FRZ_TYPE: - case PEC_NEST_STK_PBCQ_TUN_BAR: - /* Not used for now */ - stack->nest_regs[reg] = val; - break; - default: - qemu_log_mask(LOG_UNIMP, "phb4_pec: nest_xscom_write 0x%"HWADDR_PRIx - "=%"PRIx64"\n", addr, val); - } -} - -static const MemoryRegionOps pnv_pec_stk_nest_xscom_ops = { - .read = pnv_pec_stk_nest_xscom_read, - .write = pnv_pec_stk_nest_xscom_write, - .valid.min_access_size = 8, - .valid.max_access_size = 8, - .impl.min_access_size = 8, - .impl.max_access_size = 8, - .endianness = DEVICE_BIG_ENDIAN, -}; - -static uint64_t pnv_pec_stk_pci_xscom_read(void *opaque, hwaddr addr, - unsigned size) -{ - PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); - uint32_t reg = addr >> 3; - - /* TODO: add list of allowed registers and error out if not */ - return stack->pci_regs[reg]; -} - -static void pnv_pec_stk_pci_xscom_write(void *opaque, hwaddr addr, - uint64_t val, unsigned size) -{ - PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(opaque); - uint32_t reg = addr >> 3; - - switch (reg) { - case PEC_PCI_STK_PCI_FIR: - stack->nest_regs[reg] = val; - break; - case PEC_PCI_STK_PCI_FIR_CLR: - stack->nest_regs[PEC_PCI_STK_PCI_FIR] &= val; - break; - case PEC_PCI_STK_PCI_FIR_SET: - stack->nest_regs[PEC_PCI_STK_PCI_FIR] |= val; - break; - case PEC_PCI_STK_PCI_FIR_MSK: - stack->nest_regs[reg] = val; - break; - case PEC_PCI_STK_PCI_FIR_MSKC: - stack->nest_regs[PEC_PCI_STK_PCI_FIR_MSK] &= val; - break; - case PEC_PCI_STK_PCI_FIR_MSKS: - stack->nest_regs[PEC_PCI_STK_PCI_FIR_MSK] |= val; - break; - case PEC_PCI_STK_PCI_FIR_ACT0: - case PEC_PCI_STK_PCI_FIR_ACT1: - stack->nest_regs[reg] = val; - break; - case PEC_PCI_STK_PCI_FIR_WOF: - stack->nest_regs[reg] = 0; - break; - case PEC_PCI_STK_ETU_RESET: - stack->nest_regs[reg] = val & 0x8000000000000000ull; - /* TODO: Implement reset */ - break; - case PEC_PCI_STK_PBAIB_ERR_REPORT: - break; - case PEC_PCI_STK_PBAIB_TX_CMD_CRED: - case PEC_PCI_STK_PBAIB_TX_DAT_CRED: - stack->nest_regs[reg] = val; - break; - default: - qemu_log_mask(LOG_UNIMP, "phb4_pec_stk: pci_xscom_write 0x%"HWADDR_PRIx - "=%"PRIx64"\n", addr, val); - } -} - -static const MemoryRegionOps pnv_pec_stk_pci_xscom_ops = { - .read = pnv_pec_stk_pci_xscom_read, - .write = pnv_pec_stk_pci_xscom_write, - .valid.min_access_size = 8, - .valid.max_access_size = 8, - .impl.min_access_size = 8, - .impl.max_access_size = 8, - .endianness = DEVICE_BIG_ENDIAN, -}; - static void pnv_pec_instance_init(Object *obj) { PnvPhb4PecState *pec = PNV_PHB4_PEC(obj); @@ -539,32 +287,7 @@ static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(dev); PnvPhb4PecState *pec = stack->pec; PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec); - PnvChip *chip = pec->chip; int phb_id = pnv_phb4_pec_get_phb_id(pec, stack->stack_no); - uint32_t pec_nest_base; - uint32_t pec_pci_base; - char name[64]; - - assert(pec); - - /* Initialize the XSCOM regions for the stack registers */ - snprintf(name, sizeof(name), "xscom-pec-%d.%d-nest-stack-%d", - pec->chip_id, pec->index, stack->stack_no); - pnv_xscom_region_init(&stack->nest_regs_mr, OBJECT(stack), - &pnv_pec_stk_nest_xscom_ops, stack, name, - PHB4_PEC_NEST_STK_REGS_COUNT); - - snprintf(name, sizeof(name), "xscom-pec-%d.%d-pci-stack-%d", - pec->chip_id, pec->index, stack->stack_no); - pnv_xscom_region_init(&stack->pci_regs_mr, OBJECT(stack), - &pnv_pec_stk_pci_xscom_ops, stack, name, - PHB4_PEC_PCI_STK_REGS_COUNT); - - /* PHB pass-through */ - snprintf(name, sizeof(name), "xscom-pec-%d.%d-pci-stack-%d-phb", - pec->chip_id, pec->index, stack->stack_no); - pnv_xscom_region_init(&stack->phb_regs_mr, OBJECT(&stack->phb), - &pnv_phb4_xscom_ops, &stack->phb, name, 0x40); object_property_set_int(OBJECT(&stack->phb), "chip-id", pec->chip_id, &error_fatal); @@ -577,21 +300,6 @@ static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) if (!sysbus_realize(SYS_BUS_DEVICE(&stack->phb), errp)) { return; } - - pec_nest_base = pecc->xscom_nest_base(pec); - pec_pci_base = pecc->xscom_pci_base(pec); - - /* Populate the XSCOM address space. */ - pnv_xscom_add_subregion(chip, - pec_nest_base + 0x40 * (stack->stack_no + 1), - &stack->nest_regs_mr); - pnv_xscom_add_subregion(chip, - pec_pci_base + 0x40 * (stack->stack_no + 1), - &stack->pci_regs_mr); - pnv_xscom_add_subregion(chip, - pec_pci_base + PNV9_XSCOM_PEC_PCI_STK0 + - 0x40 * stack->stack_no, - &stack->phb_regs_mr); } static Property pnv_pec_stk_properties[] = { From patchwork Wed Jan 12 11:55:48 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711413 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 48DC9C4332F for ; Wed, 12 Jan 2022 13:49:30 +0000 (UTC) Received: from localhost ([::1]:52392 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7e0H-0002vj-AA for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:49:29 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60946) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFO-0007BP-ED; Wed, 12 Jan 2022 06:56:58 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:4556) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFK-0007Zn-ED; Wed, 12 Jan 2022 06:56:58 -0500 Received: from pps.filterd (m0098396.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAu8Xc017179; Wed, 12 Jan 2022 11:56:30 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0ub3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:29 +0000 Received: from m0098396.ppops.net (m0098396.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBuTGE000448; Wed, 12 Jan 2022 11:56:29 GMT Received: from ppma04ams.nl.ibm.com (63.31.33a9.ip4.static.sl-reverse.com [169.51.49.99]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhrdw0ua3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:29 +0000 Received: from pps.filterd (ppma04ams.nl.ibm.com [127.0.0.1]) by ppma04ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBkxFG018217; Wed, 12 Jan 2022 11:56:26 GMT Received: from b06cxnps4076.portsmouth.uk.ibm.com (d06relay13.portsmouth.uk.ibm.com [9.149.109.198]) by ppma04ams.nl.ibm.com with ESMTP id 3df289ap4t-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:26 +0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuNU735127680 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:23 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C5D4111C074; Wed, 12 Jan 2022 11:56:23 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 83CD711C05B; Wed, 12 Jan 2022 11:56:23 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av25.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:23 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id C95B92201C6; Wed, 12 Jan 2022 12:56:22 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 31/34] ppc/pnv: turn 'phb' into a pointer in struct PnvPhb4PecStack Date: Wed, 12 Jan 2022 12:55:48 +0100 Message-Id: <20220112115551.987666-32-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: I7uJ8ZBFkZDbXMTNC3VZhR6nE9KrXmoh X-Proofpoint-GUID: zmFd1jcoz1EC7ibpVgHXWpOBVtFm4I0D X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 mlxlogscore=644 malwarescore=0 bulkscore=0 clxscore=1034 priorityscore=1501 phishscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 mlxscore=0 impostorscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza At this moment, stack->phb is the plain PnvPHB4 device itself instead of a pointer to the device. This will present a problem when adding user creatable devices because we can't deal with this struct and the realize() callback from the user creatable device. We can't get rid of this attribute, similar to what we did when enabling pnv-phb3 user creatable devices, because pnv_phb4_update_regions() needs to access stack->phb to do its job. This function is called twice in pnv_pec_stk_update_map(), which is one of the nested xscom write callbacks (via pnv_pec_stk_nest_xscom_write()). In fact, pnv_pec_stk_update_map() code comment is explicit about how the order of the unmap/map operations relates with the PHB subregions. All of this indicates that this code is tied together in a way that we either go on a crusade, featuring lots of refactories and redesign and considerable pain, to decouple stack and phb mapping, or we allow stack update_map operations to access the associated PHB as it is today even after introducing pnv-phb4 user devices. This patch chooses the latter. Instead of getting rid of stack->phb, turn it into a PHB pointer. This will allow us to assign an user created PHB to an existing stack later. In this process, pnv_pec_stk_instance_init() is removed because stack->phb is being initialized in stk_realize() instead. Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220111131027.599784-4-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/pci-host/pnv_phb4.h | 7 +++++-- hw/pci-host/pnv_phb4.c | 2 +- hw/pci-host/pnv_phb4_pec.c | 20 +++++++------------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/include/hw/pci-host/pnv_phb4.h b/include/hw/pci-host/pnv_phb4.h index 5ee996ebc650..82f054cf218a 100644 --- a/include/hw/pci-host/pnv_phb4.h +++ b/include/hw/pci-host/pnv_phb4.h @@ -177,8 +177,11 @@ struct PnvPhb4PecStack { /* The owner PEC */ PnvPhb4PecState *pec; - /* The actual PHB */ - PnvPHB4 phb; + /* + * PHB4 pointer. pnv_phb4_update_regions() needs to access + * the PHB4 via a PnvPhb4PecStack pointer. + */ + PnvPHB4 *phb; }; struct PnvPhb4PecState { diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index 8ef58bf2de7a..e25adb88604c 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -1728,7 +1728,7 @@ type_init(pnv_phb4_register_types); void pnv_phb4_update_regions(PnvPhb4PecStack *stack) { - PnvPHB4 *phb = &stack->phb; + PnvPHB4 *phb = stack->phb; /* Unmap first always */ if (memory_region_is_mapped(&phb->mr_regs)) { diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c index bf0fdf33fd8c..d4c52a5d284c 100644 --- a/hw/pci-host/pnv_phb4_pec.c +++ b/hw/pci-host/pnv_phb4_pec.c @@ -275,13 +275,6 @@ static const TypeInfo pnv_pec_type_info = { } }; -static void pnv_pec_stk_instance_init(Object *obj) -{ - PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(obj); - - object_initialize_child(obj, "phb", &stack->phb, TYPE_PNV_PHB4); -} - static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) { PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(dev); @@ -289,15 +282,17 @@ static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec); int phb_id = pnv_phb4_pec_get_phb_id(pec, stack->stack_no); - object_property_set_int(OBJECT(&stack->phb), "chip-id", pec->chip_id, + stack->phb = PNV_PHB4(qdev_new(TYPE_PNV_PHB4)); + + object_property_set_int(OBJECT(stack->phb), "chip-id", pec->chip_id, &error_fatal); - object_property_set_int(OBJECT(&stack->phb), "index", phb_id, + object_property_set_int(OBJECT(stack->phb), "index", phb_id, &error_fatal); - object_property_set_int(OBJECT(&stack->phb), "version", pecc->version, + object_property_set_int(OBJECT(stack->phb), "version", pecc->version, &error_fatal); - object_property_set_link(OBJECT(&stack->phb), "stack", OBJECT(stack), + object_property_set_link(OBJECT(stack->phb), "stack", OBJECT(stack), &error_abort); - if (!sysbus_realize(SYS_BUS_DEVICE(&stack->phb), errp)) { + if (!sysbus_realize(SYS_BUS_DEVICE(stack->phb), errp)) { return; } } @@ -324,7 +319,6 @@ static const TypeInfo pnv_pec_stk_type_info = { .name = TYPE_PNV_PHB4_PEC_STACK, .parent = TYPE_DEVICE, .instance_size = sizeof(PnvPhb4PecStack), - .instance_init = pnv_pec_stk_instance_init, .class_init = pnv_pec_stk_class_init, .interfaces = (InterfaceInfo[]) { { TYPE_PNV_XSCOM_INTERFACE }, From patchwork Wed Jan 12 11:55:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711395 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 66B14C433F5 for ; Wed, 12 Jan 2022 13:38:19 +0000 (UTC) Received: from localhost ([::1]:33716 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dpS-0005yc-A2 for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:38:18 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60862) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFK-00073Z-4d; Wed, 12 Jan 2022 06:56:56 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:64576 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFI-0007Yq-FC; Wed, 12 Jan 2022 06:56:53 -0500 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CApS5X009479; Wed, 12 Jan 2022 11:56:29 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhwkut9xs-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:29 +0000 Received: from m0098414.ppops.net (m0098414.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CAwSoW013591; Wed, 12 Jan 2022 11:56:29 GMT Received: from ppma05fra.de.ibm.com (6c.4a.5195.ip4.static.sl-reverse.com [149.81.74.108]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhwkut9wj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:28 +0000 Received: from pps.filterd (ppma05fra.de.ibm.com [127.0.0.1]) by ppma05fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmRB7031229; Wed, 12 Jan 2022 11:56:26 GMT Received: from b06cxnps3075.portsmouth.uk.ibm.com (d06relay10.portsmouth.uk.ibm.com [9.149.109.195]) by ppma05fra.de.ibm.com with ESMTP id 3df289h2y9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:26 +0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps3075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuOd230671174 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:24 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 655325204E; Wed, 12 Jan 2022 11:56:24 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av21.portsmouth.uk.ibm.com (Postfix) with SMTP id 237DA52057; Wed, 12 Jan 2022 11:56:24 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 7451E22016C; Wed, 12 Jan 2022 12:56:23 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 32/34] ppc/pnv: Introduce user creatable pnv-phb4 devices Date: Wed, 12 Jan 2022 12:55:49 +0100 Message-Id: <20220112115551.987666-33-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 9hUVrHV9OatVjMZIwVU73RuVWk2EidvS X-Proofpoint-GUID: BYlaUFpEySxv2mf7cbc_J43ujvjzDrxL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_03,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 clxscore=1034 phishscore=0 bulkscore=0 priorityscore=1501 adultscore=0 spamscore=0 mlxlogscore=999 lowpriorityscore=0 impostorscore=0 mlxscore=0 suspectscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza This patch introduces pnv-phb4 user creatable devices that are created in a similar manner as pnv-phb3 devices, allowing the user to interact with the PHBs directly instead of creating PCI Express Controllers that will create a certain amount of PHBs per controller index. We accomplish this by doing the following: - add a pnv_phb4_get_stack() helper to retrieve which stack an user created phb4 would occupy; - when dealing with an user created pnv-phb4 (detected by checking if phb->stack is NULL at the start of phb4_realize()), retrieve its stack and initialize its properties as done in stk_realize(); - use 'defaults_enabled()' in stk_realize() to avoid creating and initializing a 'stack->phb' qdev that might be overwritten by an user created pnv-phb4 device. This process is wrapped into a new helper called pnv_pec_stk_default_phb_realize(). Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220111131027.599784-5-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb4.c | 74 ++++++++++++++++++++++++++++++++++++-- hw/pci-host/pnv_phb4_pec.c | 17 +++++++-- hw/ppc/pnv.c | 2 ++ 3 files changed, 89 insertions(+), 4 deletions(-) diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index e25adb88604c..ffa1453eee26 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -1487,15 +1487,85 @@ static void pnv_phb4_instance_init(Object *obj) object_initialize_child(obj, "source", &phb->xsrc, TYPE_XIVE_SOURCE); } +static PnvPhb4PecStack *pnv_phb4_get_stack(PnvChip *chip, PnvPHB4 *phb, + Error **errp) +{ + Pnv9Chip *chip9 = PNV9_CHIP(chip); + int chip_id = phb->chip_id; + int index = phb->phb_id; + int i, j; + + for (i = 0; i < chip->num_pecs; i++) { + /* + * For each PEC, check the amount of stacks it supports + * and see if the given phb4 index matches a stack. + */ + PnvPhb4PecState *pec = &chip9->pecs[i]; + + for (j = 0; j < pec->num_stacks; j++) { + if (index == pnv_phb4_pec_get_phb_id(pec, j)) { + return &pec->stacks[j]; + } + } + } + + error_setg(errp, + "pnv-phb4 chip-id %d index %d didn't match any existing PEC", + chip_id, index); + + return NULL; +} + static void pnv_phb4_realize(DeviceState *dev, Error **errp) { PnvPHB4 *phb = PNV_PHB4(dev); PCIHostState *pci = PCI_HOST_BRIDGE(dev); XiveSource *xsrc = &phb->xsrc; + Error *local_err = NULL; int nr_irqs; char name[32]; - assert(phb->stack); + /* User created PHB */ + if (!phb->stack) { + PnvMachineState *pnv = PNV_MACHINE(qdev_get_machine()); + PnvChip *chip = pnv_get_chip(pnv, phb->chip_id); + PnvPhb4PecClass *pecc; + BusState *s; + + if (!chip) { + error_setg(errp, "invalid chip id: %d", phb->chip_id); + return; + } + + phb->stack = pnv_phb4_get_stack(chip, phb, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + /* All other phb properties but 'version' are already set */ + pecc = PNV_PHB4_PEC_GET_CLASS(phb->stack->pec); + object_property_set_int(OBJECT(phb), "version", pecc->version, + &error_fatal); + + /* + * Assign stack->phb since pnv_phb4_update_regions() uses it + * to access the phb. + */ + phb->stack->phb = phb; + + /* + * Reparent user created devices to the chip to build + * correctly the device tree. + */ + pnv_chip_parent_fixup(chip, OBJECT(phb), phb->phb_id); + + s = qdev_get_parent_bus(DEVICE(chip)); + if (!qdev_set_parent_bus(DEVICE(phb), s, &local_err)) { + error_propagate(errp, local_err); + return; + } + } /* Set the "big_phb" flag */ phb->big_phb = phb->phb_id == 0 || phb->phb_id == 3; @@ -1600,7 +1670,7 @@ static void pnv_phb4_class_init(ObjectClass *klass, void *data) dc->realize = pnv_phb4_realize; device_class_set_props(dc, pnv_phb4_properties); set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); - dc->user_creatable = false; + dc->user_creatable = true; xfc->notify = pnv_phb4_xive_notify; } diff --git a/hw/pci-host/pnv_phb4_pec.c b/hw/pci-host/pnv_phb4_pec.c index d4c52a5d284c..7fe7f1f007dd 100644 --- a/hw/pci-host/pnv_phb4_pec.c +++ b/hw/pci-host/pnv_phb4_pec.c @@ -19,6 +19,7 @@ #include "hw/pci/pci_bus.h" #include "hw/ppc/pnv.h" #include "hw/qdev-properties.h" +#include "sysemu/sysemu.h" #include @@ -275,9 +276,9 @@ static const TypeInfo pnv_pec_type_info = { } }; -static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) +static void pnv_pec_stk_default_phb_realize(PnvPhb4PecStack *stack, + Error **errp) { - PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(dev); PnvPhb4PecState *pec = stack->pec; PnvPhb4PecClass *pecc = PNV_PHB4_PEC_GET_CLASS(pec); int phb_id = pnv_phb4_pec_get_phb_id(pec, stack->stack_no); @@ -292,11 +293,23 @@ static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) &error_fatal); object_property_set_link(OBJECT(stack->phb), "stack", OBJECT(stack), &error_abort); + if (!sysbus_realize(SYS_BUS_DEVICE(stack->phb), errp)) { return; } } +static void pnv_pec_stk_realize(DeviceState *dev, Error **errp) +{ + PnvPhb4PecStack *stack = PNV_PHB4_PEC_STACK(dev); + + if (!defaults_enabled()) { + return; + } + + pnv_pec_stk_default_phb_realize(stack, errp); +} + static Property pnv_pec_stk_properties[] = { DEFINE_PROP_UINT32("stack-no", PnvPhb4PecStack, stack_no, 0), DEFINE_PROP_LINK("pec", PnvPhb4PecStack, pec, TYPE_PNV_PHB4_PEC, diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c index fe7e67e73a3c..837146a2fbbe 100644 --- a/hw/ppc/pnv.c +++ b/hw/ppc/pnv.c @@ -1960,6 +1960,8 @@ static void pnv_machine_power9_class_init(ObjectClass *oc, void *data) pmc->compat = compat; pmc->compat_size = sizeof(compat); pmc->dt_power_mgt = pnv_dt_power_mgt; + + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_PNV_PHB4); } static void pnv_machine_power10_class_init(ObjectClass *oc, void *data) From patchwork Wed Jan 12 11:55:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711375 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 31135C433EF for ; Wed, 12 Jan 2022 13:15:00 +0000 (UTC) Received: from localhost ([::1]:60468 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7dSq-0008V0-Bd for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:14:57 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60914) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFM-00074n-Vt; Wed, 12 Jan 2022 06:56:57 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:4896 helo=mx0a-001b2d01.pphosted.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFJ-0007ZK-6H; Wed, 12 Jan 2022 06:56:54 -0500 Received: from pps.filterd (m0098413.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAVGdc017179; Wed, 12 Jan 2022 11:56:30 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhtkr6f6e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:30 +0000 Received: from m0098413.ppops.net (m0098413.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBjZe3002843; Wed, 12 Jan 2022 11:56:30 GMT Received: from ppma02fra.de.ibm.com (47.49.7a9f.ip4.static.sl-reverse.com [159.122.73.71]) by mx0b-001b2d01.pphosted.com with ESMTP id 3dhtkr6f59-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:29 +0000 Received: from pps.filterd (ppma02fra.de.ibm.com [127.0.0.1]) by ppma02fra.de.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBmEap022278; Wed, 12 Jan 2022 11:56:27 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma02fra.de.ibm.com with ESMTP id 3df28a91he-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:27 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuPgA45875638 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:25 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 12622A4ED6; Wed, 12 Jan 2022 11:56:25 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id CB8B3A4ECC; Wed, 12 Jan 2022 11:56:24 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:24 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id 1D8712201C6; Wed, 12 Jan 2022 12:56:24 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 33/34] ppc/pnv: turn pnv_phb4_update_regions() into static Date: Wed, 12 Jan 2022 12:55:50 +0100 Message-Id: <20220112115551.987666-34-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: mFplMtzUh7zhQy-4oWcOaGAn5Pjk0nBJ X-Proofpoint-ORIG-GUID: ntq-4IkywF37YbCwsqVfbrR6n_42lcPg X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 mlxlogscore=913 clxscore=1034 spamscore=0 phishscore=0 bulkscore=0 priorityscore=1501 mlxscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.158.5; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -7 X-Spam_score: -0.8 X-Spam_bar: / X-Spam_report: (-0.8 / 5.0 requ) BAYES_00=-1.9, KHOP_HELO_FCRDNS=0.398, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza Its only callers are inside pnv_phb4.c. Reviewed-by: Cédric Le Goater Signed-off-by: Daniel Henrique Barboza Message-Id: <20220111131027.599784-6-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- include/hw/pci-host/pnv_phb4.h | 1 - hw/pci-host/pnv_phb4.c | 52 +++++++++++++++++----------------- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/include/hw/pci-host/pnv_phb4.h b/include/hw/pci-host/pnv_phb4.h index 82f054cf218a..4b7ce8a7239f 100644 --- a/include/hw/pci-host/pnv_phb4.h +++ b/include/hw/pci-host/pnv_phb4.h @@ -131,7 +131,6 @@ struct PnvPHB4 { }; void pnv_phb4_pic_print_info(PnvPHB4 *phb, Monitor *mon); -void pnv_phb4_update_regions(PnvPhb4PecStack *stack); int pnv_phb4_pec_get_phb_id(PnvPhb4PecState *pec, int stack_index); extern const MemoryRegionOps pnv_phb4_xscom_ops; diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index ffa1453eee26..be29174f13c5 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -868,6 +868,32 @@ static uint64_t pnv_pec_stk_nest_xscom_read(void *opaque, hwaddr addr, return stack->nest_regs[reg]; } +static void pnv_phb4_update_regions(PnvPhb4PecStack *stack) +{ + PnvPHB4 *phb = stack->phb; + + /* Unmap first always */ + if (memory_region_is_mapped(&phb->mr_regs)) { + memory_region_del_subregion(&stack->phbbar, &phb->mr_regs); + } + if (memory_region_is_mapped(&phb->xsrc.esb_mmio)) { + memory_region_del_subregion(&stack->intbar, &phb->xsrc.esb_mmio); + } + + /* Map registers if enabled */ + if (memory_region_is_mapped(&stack->phbbar)) { + memory_region_add_subregion(&stack->phbbar, 0, &phb->mr_regs); + } + + /* Map ESB if enabled */ + if (memory_region_is_mapped(&stack->intbar)) { + memory_region_add_subregion(&stack->intbar, 0, &phb->xsrc.esb_mmio); + } + + /* Check/update m32 */ + pnv_phb4_check_all_mbt(phb); +} + static void pnv_pec_stk_update_map(PnvPhb4PecStack *stack) { PnvPhb4PecState *pec = stack->pec; @@ -1796,32 +1822,6 @@ static void pnv_phb4_register_types(void) type_init(pnv_phb4_register_types); -void pnv_phb4_update_regions(PnvPhb4PecStack *stack) -{ - PnvPHB4 *phb = stack->phb; - - /* Unmap first always */ - if (memory_region_is_mapped(&phb->mr_regs)) { - memory_region_del_subregion(&stack->phbbar, &phb->mr_regs); - } - if (memory_region_is_mapped(&phb->xsrc.esb_mmio)) { - memory_region_del_subregion(&stack->intbar, &phb->xsrc.esb_mmio); - } - - /* Map registers if enabled */ - if (memory_region_is_mapped(&stack->phbbar)) { - memory_region_add_subregion(&stack->phbbar, 0, &phb->mr_regs); - } - - /* Map ESB if enabled */ - if (memory_region_is_mapped(&stack->intbar)) { - memory_region_add_subregion(&stack->intbar, 0, &phb->xsrc.esb_mmio); - } - - /* Check/update m32 */ - pnv_phb4_check_all_mbt(phb); -} - void pnv_phb4_pic_print_info(PnvPHB4 *phb, Monitor *mon) { uint32_t offset = phb->regs[PHB_INT_NOTIFY_INDEX >> 3]; From patchwork Wed Jan 12 11:55:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?C=C3=A9dric_Le_Goater?= X-Patchwork-Id: 12711380 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 4E003C4332F for ; Wed, 12 Jan 2022 13:22:58 +0000 (UTC) Received: from localhost ([::1]:43314 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1n7daa-00009C-TJ for qemu-devel@archiver.kernel.org; Wed, 12 Jan 2022 08:22:56 -0500 Received: from eggs.gnu.org ([209.51.188.92]:60958) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFP-0007ES-DY; Wed, 12 Jan 2022 06:56:59 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:9650) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1n7cFM-0007aC-5A; Wed, 12 Jan 2022 06:56:59 -0500 Received: from pps.filterd (m0098404.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.1.2/8.16.1.2) with SMTP id 20CAUDgE010185; Wed, 12 Jan 2022 11:56:31 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhthsxfbk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:31 +0000 Received: from m0098404.ppops.net (m0098404.ppops.net [127.0.0.1]) by pps.reinject (8.16.0.43/8.16.0.43) with SMTP id 20CBuVte002714; Wed, 12 Jan 2022 11:56:31 GMT Received: from ppma06ams.nl.ibm.com (66.31.33a9.ip4.static.sl-reverse.com [169.51.49.102]) by mx0a-001b2d01.pphosted.com with ESMTP id 3dhthsxfa8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:31 +0000 Received: from pps.filterd (ppma06ams.nl.ibm.com [127.0.0.1]) by ppma06ams.nl.ibm.com (8.16.1.2/8.16.1.2) with SMTP id 20CBnFbx025506; Wed, 12 Jan 2022 11:56:28 GMT Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by ppma06ams.nl.ibm.com with ESMTP id 3df1vjasab-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 12 Jan 2022 11:56:28 +0000 Received: from d06av23.portsmouth.uk.ibm.com (d06av23.portsmouth.uk.ibm.com [9.149.105.59]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 20CBuPcN25690582 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 12 Jan 2022 11:56:26 GMT Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C7987A4EC3; Wed, 12 Jan 2022 11:56:25 +0000 (GMT) Received: from d06av23.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 853B0A4ED7; Wed, 12 Jan 2022 11:56:25 +0000 (GMT) Received: from smtp.tlslab.ibm.com (unknown [9.101.4.1]) by d06av23.portsmouth.uk.ibm.com (Postfix) with SMTP; Wed, 12 Jan 2022 11:56:25 +0000 (GMT) Received: from yukon.ibmuc.com (unknown [9.171.70.95]) by smtp.tlslab.ibm.com (Postfix) with ESMTP id BB9C622016C; Wed, 12 Jan 2022 12:56:24 +0100 (CET) From: =?utf-8?q?C=C3=A9dric_Le_Goater?= To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org Subject: [PULL 34/34] ppc/pnv: use stack->pci_regs[] in pnv_pec_stk_pci_xscom_write() Date: Wed, 12 Jan 2022 12:55:51 +0100 Message-Id: <20220112115551.987666-35-clg@kaod.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112115551.987666-1-clg@kaod.org> References: <20220112115551.987666-1-clg@kaod.org> MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Proofpoint-GUID: w6GmLKEZ6nACNbehqcBH5ASRjeX4LjqV X-Proofpoint-ORIG-GUID: QmA1tTw_wQH0jvGlNPoG1qeacLd9EVJ6 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.205,Aquarius:18.0.790,Hydra:6.0.425,FMLib:17.11.62.513 definitions=2022-01-12_04,2022-01-11_01,2021-12-02_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 clxscore=1034 malwarescore=0 bulkscore=0 phishscore=0 mlxlogscore=999 mlxscore=0 priorityscore=1501 adultscore=0 suspectscore=0 spamscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2110150000 definitions=main-2201120075 Received-SPF: softfail client-ip=148.163.156.1; envelope-from=clg@kaod.org; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665 autolearn=no 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: , Cc: Frederic Barrat , Peter Maydell , Daniel Henrique Barboza , Richard Henderson , =?utf-8?q?C=C3=A9dric_Le_?= =?utf-8?q?Goater?= Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" From: Daniel Henrique Barboza pnv_pec_stk_pci_xscom_write() is pnv_pec_stk_pci_xscom_ops write callback. It writes values into regs in the stack->nest_regs[] array. The pnv_pec_stk_pci_xscom_read read callback, on the other hand, returns values of the stack->pci_regs[]. In fact, at this moment, the only use of stack->pci_regs[] is in pnv_pec_stk_pci_xscom_read(). There's no code that is written anything in stack->pci_regs[], which is suspicious. Considering that stack->nest_regs[] is widely used by the nested MemoryOps pnv_pec_stk_nest_xscom_ops, in both read and write callbacks, the conclusion is that we're writing the wrong array in pnv_pec_stk_pci_xscom_write(). This function should write stack->pci_regs[] instead. Signed-off-by: Daniel Henrique Barboza Reviewed-by: Frederic Barrat Message-Id: <20220111200132.633896-2-danielhb413@gmail.com> Signed-off-by: Cédric Le Goater --- hw/pci-host/pnv_phb4.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/hw/pci-host/pnv_phb4.c b/hw/pci-host/pnv_phb4.c index be29174f13c5..a7b638831ea5 100644 --- a/hw/pci-host/pnv_phb4.c +++ b/hw/pci-host/pnv_phb4.c @@ -1086,39 +1086,39 @@ static void pnv_pec_stk_pci_xscom_write(void *opaque, hwaddr addr, switch (reg) { case PEC_PCI_STK_PCI_FIR: - stack->nest_regs[reg] = val; + stack->pci_regs[reg] = val; break; case PEC_PCI_STK_PCI_FIR_CLR: - stack->nest_regs[PEC_PCI_STK_PCI_FIR] &= val; + stack->pci_regs[PEC_PCI_STK_PCI_FIR] &= val; break; case PEC_PCI_STK_PCI_FIR_SET: - stack->nest_regs[PEC_PCI_STK_PCI_FIR] |= val; + stack->pci_regs[PEC_PCI_STK_PCI_FIR] |= val; break; case PEC_PCI_STK_PCI_FIR_MSK: - stack->nest_regs[reg] = val; + stack->pci_regs[reg] = val; break; case PEC_PCI_STK_PCI_FIR_MSKC: - stack->nest_regs[PEC_PCI_STK_PCI_FIR_MSK] &= val; + stack->pci_regs[PEC_PCI_STK_PCI_FIR_MSK] &= val; break; case PEC_PCI_STK_PCI_FIR_MSKS: - stack->nest_regs[PEC_PCI_STK_PCI_FIR_MSK] |= val; + stack->pci_regs[PEC_PCI_STK_PCI_FIR_MSK] |= val; break; case PEC_PCI_STK_PCI_FIR_ACT0: case PEC_PCI_STK_PCI_FIR_ACT1: - stack->nest_regs[reg] = val; + stack->pci_regs[reg] = val; break; case PEC_PCI_STK_PCI_FIR_WOF: - stack->nest_regs[reg] = 0; + stack->pci_regs[reg] = 0; break; case PEC_PCI_STK_ETU_RESET: - stack->nest_regs[reg] = val & 0x8000000000000000ull; + stack->pci_regs[reg] = val & 0x8000000000000000ull; /* TODO: Implement reset */ break; case PEC_PCI_STK_PBAIB_ERR_REPORT: break; case PEC_PCI_STK_PBAIB_TX_CMD_CRED: case PEC_PCI_STK_PBAIB_TX_DAT_CRED: - stack->nest_regs[reg] = val; + stack->pci_regs[reg] = val; break; default: qemu_log_mask(LOG_UNIMP, "phb4_pec_stk: pci_xscom_write 0x%"HWADDR_PRIx