From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916612; cv=none; d=zohomail.com; s=zohoarc; b=gKV2iGrBloPtmvQTHuykDPmGcoK9uPJNFaIPBdP7YCoIetOBXu6MGQfoYd1yWZdqIeBkAxmGwIUEOShTxACAS/OdQ4xKlAGy6p/BBJe6aX+m9AyEZ8ms/Tl5H0r1MDeL2R6SbkLx04t1z2KXb2lA3OFwdREOv0C13jPMzTNXTrU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916612; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=p6z38RdTDcY3teR9UacJfqP7DIhYR9PcrjV7dGlrt3A=; b=OmQCWJrRSMfcqmrzZL3ouTrfPZLIqkqQWxPI5vDof2L0pnVC3DxfYnlcD6I9QRv/r/EoJrdJeewVEVWAF4vhiXbgGdTb0JhBk06+4PNZ0BV2bzkVgIdcoc9w8JKODY4LBXRIno1uasnAhQ2IR48Hr3j0UYNWu6+nf4WS5FGYrtk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916612272664.8480595180752; Fri, 28 Aug 2026 04:30:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzulj-0001nt-Rk; Fri, 28 Aug 2026 07:29:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulh-0001mv-Oz for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:09 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulf-0007cm-F4 for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:09 -0400 Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA7ceY2744783 for ; Fri, 28 Aug 2026 11:29:06 GMT Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb3mxsh5v-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:06 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-84e5a0317a5so210998b3a.1 for ; Fri, 28 Aug 2026 04:29:06 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.28.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:28:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= p6z38RdTDcY3teR9UacJfqP7DIhYR9PcrjV7dGlrt3A=; b=mEpdHTCWpRWcJY9k 5uFoOHj1xyLEvwtek5BD6zJIzgkn4oHpi6knnH9ts5Hh30VyyJbzqlUvwiG16DZg LFGJrwJojzO+I33a6Z2IMrARSxAmK6zwyRSMqfMN06a8XRbF7d1WpMQCPAMaqRco GM00um+F3OSmlZ8QXt9qmW77frAUaZNoIovMZMjka8qgTXqPh1SAnOkozxQ7gTjM 7BAq78CSm28Y0vHpNhaD4Dn3xn6CUk0AooVRIrUYguQzKjXIjFzxZIuKGkejHXvI /SYrR2iuLZxQl/WgfVmSIh4ClB8TesbIQxvOqtX/lFQ2X0+CxfHsH8+6Itg1AE/7 6cT8Uw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916545; x=1788521345; darn=nongnu.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=p6z38RdTDcY3teR9UacJfqP7DIhYR9PcrjV7dGlrt3A=; b=N7pta3iF2BU244ZTvkwvpxBN5p5vIdj4xrrsHZZYp83TfYApKVu/FN2Ae1ODLMAL7X HDy7MDLM2SpBW1vm+vyg+UsvnQ6I4lS8iS3KvRrvka89TGYuTmSEBvcNMPcU8+UKlRkA PrOFKmddlVxqx0HPC4CCNZmiqe/s8eYK/GQ4KKsPIOPINnd43ga42jttTnErnnXB7282 0MQDnVjmYJVvSnsHqaN4aS1BUuSJZXu0n3R3TolTonnOfQjWaYwVUTgwVDBk9SE+mS9U A1+L/fUWlxitSIH+t8O45ERhMPNLIwQJWBXKHBG8VEhMD2sZSIxAPvMKCaOsmrjpeNjp 7Wvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916545; x=1788521345; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=p6z38RdTDcY3teR9UacJfqP7DIhYR9PcrjV7dGlrt3A=; b=rTJ590bIT37BJCP+WAkMJYGbLghLqIzsGjAD/rMbP02CNaYRug+o6hW85qd7x2zqFX 8HS2xLrGMMB4TqlaITgy6DfQHVuNSVj7SuxwhJNTc786SjDCVCnf+uSK0lHx1YQDNg+u eyaU2GMOiDcDFtmontmnLj+eCu7rnEE3vZAgelUmrzGeQo9rdKD88cQHtuicDTiBV53N KFXQmEWuvwnufk4goJ+UzhjvfxO5Px9RtrhoVw2jUgDaMApmVMOPientpkS4H0BgUZMt 3BKJLJjOF9vEYoR72XbOIpODMXmh6X98B2g0jKxO5jfJzeRWk6dFJW/LIYdBlPi1CUtN 286Q== X-Gm-Message-State: AFuF++mvwrS51h73oD2VIhsFz97R3HVwL5o5TzvgekvDOXa24Ku31t58 5t6llkLnXEVzVpKzqYSe1PUoCfMe6w2Yz6TjDXekjDZFWHRQjirVGy+L8kiDS03guIcq3zwcu4+ FeLGSKkZlYcbTa24SYRj3ZxwBfrpoa9WvnxlMj/pB7sfXdu9+WibFzuKXKco7DK4GKQ== X-Gm-Gg: AR+sD12BLa9Z8/iWH6TmuA6k1qdPJIyrk3s4XGVRVWozeh+ODLv/lsUoTqteG1gMBhv OVNFYm+l3fykvmrNfvRrKw11vR1f4k/zsP72Eqa+y0mFDZxfNaQ+notEGLP82IlzfBly/VAkc9V UwhvnCiaRK0gPZvs968gpzxuqcboC11ZcQML2QTpbCoy840EQeDh8UnffKIhFzSKSm3lCHoyAaX I+jMyirbfYwUWAzszytN+NPHLinc+vdaoD2aO99rx+3IJ+NbAVRcr4FeO2nC5bu+RPkOoLjclYQ i8lbZRON4QWxzVbhdcR1VKhlbe91hHUbDpv+oIfiFYK7y6n9OGdM/ehcx70irUPXyuvelSBkeNV NKfsqAMMpjnvE9wXJrgWEmPBqlPJwkTVx94py1t22P3tzuCjaQll2GC+tWC7DwLOIzR+2/XmRHj rEmQQYO123CXLYMVG5MoZ0u5aEoCKZyLo= X-Received: by 2002:a17:90b:380b:b0:396:54a9:8d87 with SMTP id 98e67ed59e1d1-396d0d81bcfmr5950134a91.1.1787916542968; Fri, 28 Aug 2026 04:29:02 -0700 (PDT) X-Received: by 2002:a17:90b:380b:b0:396:54a9:8d87 with SMTP id 98e67ed59e1d1-396d0d81bcfmr5949685a91.1.1787916537737; Fri, 28 Aug 2026 04:28:57 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Daniel Henrique Barboza , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Paolo Bonzini , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Pierrick Bouvier , =?UTF-8?q?Alex=20Benn=C3=A9e?= Subject: [PATCH v10 01/10] build: add optional librpmi dependency Date: Fri, 28 Aug 2026 16:57:53 +0530 Message-ID: <20260828112803.86636-2-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX2jQf0s5q7iLj ktA6oKXBOvnWS96nY6LHRNs9NCbNTt5DAxQ6dsnfky14hD+BtRN2d8htsINMXWxwSyf97x6K6S5 VHviZmwKbIolz0kux+8dkGP7iYX0bipk/kBmgliNqGGUq6mYIts/OreKIH+jt+JRCSUe4705ADF v9aFTF07ma48OLkBu60R77Sx9v7/yJORHpuz08O8VPQUJsFBioqGe8joEduVetXBecffQtoTAw5 Bu3qQBSPXAFXqmNhgqd6Z0siwWB3s1KTLhh0VOZO3ZaIXPIgbSIh7vIOw3SwpRqTfyOk4K/XlV/ x0Cl4RYI9sV0OY9UYYbhoEX8RSpEZl5dyV0EzAKP12U7DDx3+vPcfUzYxaR2sHCPDgIXXtcGLfi NwMLIXTOAZLwwELnrSno+05trM/MEtTc9r7+othIvg+XHblImro4TvapUWf/mFIBLwd+DTyf8Ec gUow4B23RSCtikDu6+g== X-Authority-Analysis: v=2.4 cv=MONQXsZl c=1 sm=1 tr=0 ts=6a917102 cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=8ots_n__tzfDkp_RMYgA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfXzF1J7DtF60tk m47KUWzLaGUGfTZjW/M3EkEgH1GlpSwJfNVol31v1PsFs4VZLQcS5jo8uVJabPV6UBXXTDQQ45O tqKtRlG+z/yvcmP80clXehfrFfDV1CE= X-Proofpoint-ORIG-GUID: 9vaT3owUOiCvAdAJ59YjoM1wNXJ_Ojzz X-Proofpoint-GUID: 9vaT3owUOiCvAdAJ59YjoM1wNXJ_Ojzz X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 lowpriorityscore=0 phishscore=0 suspectscore=0 bulkscore=0 impostorscore=0 spamscore=0 priorityscore=1501 clxscore=1015 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916614237154100 Add a meson option and config probe for librpmi so RISC-V machines can opt into RPMI support when the library is available. Keep the dependency optional so default builds without librpmi continue to work. Signed-off-by: Subrahmanya Lingappa Reviewed-by: Daniel Henrique Barboza Reviewed-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Alistair Francis Reviewed-by: Sunil V L --- Kconfig.host | 3 +++ meson.build | 14 ++++++++++++++ meson_options.txt | 2 ++ scripts/meson-buildoptions.sh | 3 +++ 4 files changed, 22 insertions(+) diff --git a/Kconfig.host b/Kconfig.host index 933425c74b..6f98dadb2e 100644 --- a/Kconfig.host +++ b/Kconfig.host @@ -8,6 +8,9 @@ config LINUX config LIBCBOR bool =20 +config LIBRPMI + bool + config GNUTLS bool =20 diff --git a/meson.build b/meson.build index 6dcfdceb50..1e1e19e655 100644 --- a/meson.build +++ b/meson.build @@ -2018,6 +2018,17 @@ if lzo.found() and not cc.links(''' endif endif =20 +librpmi =3D not_found +if not get_option('librpmi').auto() or have_system + librpmi =3D dependency('librpmi', required: get_option('librpmi'), + method: 'pkg-config') + if librpmi.found() and not cc.has_header_symbol('librpmi.h', + 'rpmi_service_group_syss= usp_create', + dependencies: librpmi) + error('librpmi support requires the RPMI system suspend service group = API') + endif +endif + numa =3D not_found if not get_option('numa').auto() or have_system or have_tools numa =3D cc.find_library('numa', has_headers: ['numa.h'], @@ -2440,6 +2451,7 @@ config_host_data.set('CONFIG_LINUX', host_os =3D=3D '= linux') config_host_data.set('CONFIG_POSIX', host_os !=3D 'windows') config_host_data.set('CONFIG_WIN32', host_os =3D=3D 'windows') config_host_data.set('CONFIG_LZO', lzo.found()) +config_host_data.set('CONFIG_LIBRPMI', librpmi.found()) config_host_data.set('CONFIG_MPATH', mpathpersist.found()) config_host_data.set('CONFIG_BLKIO', blkio.found()) if blkio.found() @@ -3272,6 +3284,7 @@ host_kconfig =3D \ (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=3Dy'] : []) + \ (vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=3Dy'] : []= ) + \ (hv_balloon ? ['CONFIG_HV_BALLOON_POSSIBLE=3Dy'] : []) + \ + (librpmi.found() ? ['CONFIG_LIBRPMI=3Dy'] : []) + \ (have_rust ? ['CONFIG_HAVE_RUST=3Dy'] : []) =20 ignored =3D [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR' ] @@ -4988,6 +5001,7 @@ summary_info +=3D {'TPM support': have_tpm} summary_info +=3D {'IGVM support': igvm} summary_info +=3D {'libssh support': libssh} summary_info +=3D {'lzo support': lzo} +summary_info +=3D {'RPMI support': librpmi} summary_info +=3D {'snappy support': snappy} summary_info +=3D {'bzip2 support': libbzip2} summary_info +=3D {'lzfse support': liblzfse} diff --git a/meson_options.txt b/meson_options.txt index a07cb47d35..a65af0e633 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -204,6 +204,8 @@ option('lzfse', type : 'feature', value : 'auto', description: 'lzfse support for DMG images') option('lzo', type : 'feature', value : 'auto', description: 'lzo compression support') +option('librpmi', type : 'feature', value : 'auto', + description: 'RPMI support') option('pvg', type: 'feature', value: 'auto', description: 'macOS paravirtualized graphics support') option('rbd', type : 'feature', value : 'auto', diff --git a/scripts/meson-buildoptions.sh b/scripts/meson-buildoptions.sh index c003985047..12179f6024 100644 --- a/scripts/meson-buildoptions.sh +++ b/scripts/meson-buildoptions.sh @@ -140,6 +140,7 @@ meson_options_help() { printf "%s\n" ' libkeyutils Linux keyutils support' printf "%s\n" ' libnfs libnfs block device driver' printf "%s\n" ' libpmem libpmem support' + printf "%s\n" ' librpmi RPMI support' printf "%s\n" ' libssh ssh block device support' printf "%s\n" ' libudev Use libudev to enumerate host devices' printf "%s\n" ' libusb libusb support for USB passthrough' @@ -376,6 +377,8 @@ _meson_option_parse() { --disable-libnfs) printf "%s" -Dlibnfs=3Ddisabled ;; --enable-libpmem) printf "%s" -Dlibpmem=3Denabled ;; --disable-libpmem) printf "%s" -Dlibpmem=3Ddisabled ;; + --enable-librpmi) printf "%s" -Dlibrpmi=3Denabled ;; + --disable-librpmi) printf "%s" -Dlibrpmi=3Ddisabled ;; --enable-libssh) printf "%s" -Dlibssh=3Denabled ;; --disable-libssh) printf "%s" -Dlibssh=3Ddisabled ;; --enable-libudev) printf "%s" -Dlibudev=3Denabled ;; --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916610; cv=none; d=zohomail.com; s=zohoarc; b=RLNixO0q4kThgxoeigsJGxd0Px50D/GA/XT72q1Wap7Z2ziNF4KjdUISjLPqyilwQSywwpNeNXOo3E6/SyHxDeoEoFHJzmF9xm7ra65zZWSU9Lnd7OOSyCszwjFnDTA7dhfirfR6b9K2CRoSJk0VnZWN/Nbik5BO7nWddTL8ALM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916610; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=990W4M4XQtIYWzmZB2kU33ZVpFLDAKEIN4coai35sCE=; b=VEsM4yaMAktnKtn7skD3ICnQlf3rLyMrlxtvxrLw60L9ChP4b3lwpmWhwzdXYS8ZCpij0FCc46Afkqn00fmwBrW/Tdodw2VHHdGvJVrjqmVTSjRTjWnKiMu1ARddIu/hY2JqOqFrbDnYLRH72sRLWOBg/F7LykJ55gMyLb/zm50= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916610039686.5268809130202; Fri, 28 Aug 2026 04:30:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzulj-0001nN-E6; Fri, 28 Aug 2026 07:29:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulg-0001mI-6f for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:08 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzuld-0007bs-7V for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:07 -0400 Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA7sp22152732 for ; Fri, 28 Aug 2026 11:29:04 GMT Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb42r9ev3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:03 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-85355ddffc1so238983b3a.0 for ; Fri, 28 Aug 2026 04:29:03 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.28.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=990W4M4XQtI YWzmZB2kU33ZVpFLDAKEIN4coai35sCE=; b=GMw4KUzivaGnPV4aNR+AjrvxS+v +uJYtC3TErIHAkdDg1KnoKhpcne1wkXjKtB/d3NVDOPTTqUOj9cJkZSyguoI8O5X v5EGTka7HHKDHtSmJYFZzsphEpKOOzSpcjV9FzzbcMdB73m/mjbXIg//izB9sLO5 vSeai72f6HaEJ0qx1dXU7Qj1t0UzwN7AO1Ub+p2gYTml8QH4pf4htwAXqYSf3bQM Unm71IYMqCArYB/cy4gYkZmYF1BAhtnctLD/+l4IPdSH3VPinL76ro2e87dv/i6p D+353RBZAlPHogexeWpMCkBj0mNq/2i5ovFJjkRdYwSRfC+y5egNXIW/YRg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916543; x=1788521343; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=990W4M4XQtIYWzmZB2kU33ZVpFLDAKEIN4coai35sCE=; b=gMQ4tl6fgTHZR+ab7HwTSlZR4xCyUnU0WhRj31IdQAE+oZ9z4GnKlj0vP7CqSAOtg0 lwSlTmyX1Bot96eHfQCZz4xwI41jOeKZjMpUp4bNkHYDgDUx6d90XfLux1GZztwt5KpZ 5Dr02DAE6ADCpOpJTmy0NTYtQ7GzvN+fV1j0kq1cIl5hyewa7RWJjJb72Xvq3QsCZv55 8i9EWhJAO7nynDQ3aaAG8VExfdWbVyIG6fokJwy80aAex+KOGt3KwU7Vo/LV20Zu+TEc 8YOrDTQAbDyqrQegDcd+4JRrS93iV6/jNUIU6jN+RAYDU5PCiHCwY55gcGQ/sakZE7HT SgXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916543; x=1788521343; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=990W4M4XQtIYWzmZB2kU33ZVpFLDAKEIN4coai35sCE=; b=kRNudP9idrN79nmtSaEqI6hWPkQa64Eo55HKHJEdOoAXUrw18Rbvn9alQUxLuTSYDW 4mxqnjJn4fGhjJoXynxRMBQIZbKazXJeXbfof7MxtWkS6XxNIJpeUIquNgiDQ5snBN7D +1kwjMirDyNnTpj9eHmMxWsVehlglFJNGHwNb7Ppwon5fbvAlCsw3g4rNMuRqyrGszey jNJFxLWw/9ybXKQehu0KOnhiMlKvKtfrNGpji6sYt2UbfoAi56dMq04IV73036kncePC a9CH173m8N2JZtGVQM6N4rxlderAKv61jFe1mxtbHTyL+XQPQ43g7w+lk2fcdu1Ta5RJ bDyA== X-Gm-Message-State: AFuF++lsvyq+uIJVCAjjsR++McJ1sJrd7gs/mG/PwFfF5rwOUxd6jz8l CM1W/80qq558/rftGlIb8xSBs/WveXPxc7lIpigvaQ1iZYYCZiQGy8zpinj52k+6VUTru8pC+KS N4kTo5IgHVwtqdF5ipp58mqxkaIIHU9wOXGoUNf5l8k5pmvKiKYryVQ3NGF/XZMpezw== X-Gm-Gg: AR+sD12pJTaC6vl5/uvssUyxh/rxgXDclcJpG4FzpNuq4JwnjveWX/kx7V6sISEr+nP FBpZz17GMqvvl+kquBuxhGtfkrvdgb5jjSpBr/sL13Bt/jY+OdepcGnTT26Ymoz3pAiMQqtkdru 4L9Kz84FpPfL0CekrCCu3zU7EZ/N+kPzKsQMa7UMy7Cnu+jmIraHRu92syqs5dk/l44vAH+/0jl A1bHdvhzubawFvUQyFHQXwqrIP2igF02hxMTNizRfuVAQInFR3khk3E3PwsvF5UiQxjvZG5hOpD GKWEza+p1rbE+wjXpBfOhUMdxEPJ5xAhtWQI5UHHViZsNsoLB09i8ZBnCoqNdCFbP2W4oE0Ev/a ts9qJdk6C3SfcMW03Z5HPuq5eaoJSZXI4Oo5Rwo6MYF1Jom4uZrLmv1QfdIVJlnYrUuDuUjgY7R tqiQOAeGu9KWvPGcFzDYXf4s/l6CX4mp0= X-Received: by 2002:a17:90b:28c4:b0:38e:6d4c:14df with SMTP id 98e67ed59e1d1-396d0edf7b7mr5659723a91.1.1787916542670; Fri, 28 Aug 2026 04:29:02 -0700 (PDT) X-Received: by 2002:a17:90b:28c4:b0:38e:6d4c:14df with SMTP id 98e67ed59e1d1-396d0edf7b7mr5659662a91.1.1787916542047; Fri, 28 Aug 2026 04:29:02 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Paolo Bonzini , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Chao Liu Subject: [PATCH v10 02/10] hw/misc: add RISC-V RPMI transport and Base support Date: Fri, 28 Aug 2026 16:57:54 +0530 Message-ID: <20260828112803.86636-3-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: J3bJKCj47pHnKLmCrP5oWmDeUs6RpKbp X-Proofpoint-ORIG-GUID: J3bJKCj47pHnKLmCrP5oWmDeUs6RpKbp X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX6UojuczuZoio Uaflino302Jp7Ir1Wg+lCDDhDdhm6hnuK6KoLvm5v6YeP1E6biXYrnAE8wOmRlZSk1UQOp31RL9 azL8fwyGLmREK0uh1SAvgH/t6xdL6oGqilspV/co6OWykq1Ojn5batAzvcrvcK+/C+u7UY8AZT3 0YGeGV5IZhp8VRsoH1PMGO2gAGCO8I22CTyjN0lAvKujx0kaYvMwnzBwDAVUYnhkSbB/JVbaJkj PWY+UA5QqooJ+POsCtnA0dninu5a6AWa1gWVPpsday581ov31gjt4Rh4aim8TF4ebp89kcrTTZ6 zNZjGTdaBh0lifx/QI999gKmze0sHGF1JJUVW6gfR/nf47i9v4aJac0BpfSdFwBGfr1JLF/6mFr dFg3lGe7CFFNcAN8VKuWTPtg2jy059QiPgRuVJmkYRnW6gnlhGRe3x+SDMUbu8srwK4Dmfzq4oi n1TLayIG3QhlXZ/mr+Q== X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX34yFBnwPlPne 1CRcB1wtOJo8FarwQ4xK+8Swdl35Bh5/zFzQaY6en1cFXpAWX0uQVBG/EZB5X+TvEfPWCBjSH0X UwBKsPLFDnY0AUNLNK8DEV+H3DELYac= X-Authority-Analysis: v=2.4 cv=Fpo1OWrq c=1 sm=1 tr=0 ts=6a9170ff cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=V1jnuoLLAAAA:20 a=NEAV23lmAAAA:8 a=EUspDBNiAAAA:8 a=oOwYG9ZlhbP0MBYDMg4A:9 a=IoOABgeZipijB_acs4fv:22 a=bA3UWDv6hWIuX7UZL3qL:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 spamscore=0 malwarescore=0 lowpriorityscore=0 phishscore=0 bulkscore=0 adultscore=0 suspectscore=0 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916611253158500 Content-Type: text/plain; charset="utf-8" RPMI (RISC-V Platform Management Interface) is the RISC-V non-ISA platform management specification. It defines a shared-memory transport, message protocol, and service groups for platform management. Add the QEMU transport backend and Base service plumbing for virt using librpmi. This implementation targets the RISC-V Platform Management Interface (RPMI) Specification v1.0 Ratified: https://github.com/riscv-non-isa/riscv-rpmi/releases/download/v1.0/riscv-rp= mi.pdf The librpmi backend is maintained at: https://github.com/riscv-software-src/librpmi Signed-off-by: Subrahmanya Lingappa --- MAINTAINERS | 2 + hw/misc/Kconfig | 4 + hw/misc/meson.build | 3 + hw/misc/riscv_rpmi-stub.c | 16 ++ hw/misc/riscv_rpmi.c | 489 ++++++++++++++++++++++++++++++++++ hw/misc/riscv_rpmi_internal.h | 24 ++ include/hw/misc/riscv_rpmi.h | 95 +++++++ 7 files changed, 633 insertions(+) create mode 100644 hw/misc/riscv_rpmi-stub.c create mode 100644 hw/misc/riscv_rpmi.c create mode 100644 hw/misc/riscv_rpmi_internal.h create mode 100644 include/hw/misc/riscv_rpmi.h diff --git a/MAINTAINERS b/MAINTAINERS index 6c18b8a419..d0973d470c 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -372,6 +372,8 @@ F: target/riscv/ F: hw/char/riscv_htif.c F: hw/riscv/ F: hw/intc/riscv* +F: hw/misc/riscv_rpmi* +F: include/hw/misc/riscv_rpmi.h F: include/hw/char/riscv_htif.h F: include/hw/riscv/ F: common-user/host/riscv* diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig index 46e3c03cc8..4b75f7a706 100644 --- a/hw/misc/Kconfig +++ b/hw/misc/Kconfig @@ -264,3 +264,7 @@ config K230_DECOMP_GZIP bool =20 source macio/Kconfig + +config RISCV_RPMI + bool + depends on LIBRPMI diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 54e07aacda..1b8220c6be 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -176,3 +176,6 @@ system_ss.add(when: 'CONFIG_SBSA_REF', if_true: files('= sbsa_ec.c')) system_ss.add(when: 'CONFIG_LASI', if_true: files('lasi.c')) =20 system_ss.add(when: 'CONFIG_AXIADO_CLK', if_true: files('axiado_clk.c')) +system_ss.add(when: 'CONFIG_RISCV_RPMI', if_true: [files( + 'riscv_rpmi.c', +), librpmi], if_false: files('riscv_rpmi-stub.c')) diff --git a/hw/misc/riscv_rpmi-stub.c b/hw/misc/riscv_rpmi-stub.c new file mode 100644 index 0000000000..dc32b43227 --- /dev/null +++ b/hw/misc/riscv_rpmi-stub.c @@ -0,0 +1,16 @@ +/* + * RISC-V RPMI stubs. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/misc/riscv_rpmi.h" + +DeviceState *riscv_rpmi_create(const RiscvRpmiConfig *cfg G_GNUC_UNUSED, + Error **errp) +{ + error_setg(errp, "RISC-V RPMI support is not compiled in"); + return NULL; +} diff --git a/hw/misc/riscv_rpmi.c b/hw/misc/riscv_rpmi.c new file mode 100644 index 0000000000..e24045c9bc --- /dev/null +++ b/hw/misc/riscv_rpmi.c @@ -0,0 +1,489 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI transport device. + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "qemu/log.h" +#include "qemu/module.h" +#include "hw/core/qdev-properties.h" +#include "hw/misc/riscv_rpmi.h" +#include "hw/misc/riscv_rpmi_internal.h" +#include "migration/vmstate.h" +#include "system/address-spaces.h" +#include "system/physmem.h" +#include "system/runstate.h" +#include "librpmi.h" +#include "librpmi_env.h" + +void *rpmi_env_zalloc(rpmi_size_t size) +{ + return g_malloc0(size); +} + +void rpmi_env_free(void *ptr) +{ + g_free(ptr); +} + +void rpmi_env_writel(rpmi_uint64_t addr, rpmi_uint32_t val) +{ + uint32_t val_le; + + stl_le_p(&val_le, val); + physical_memory_write(addr, &val_le, sizeof(val_le)); +} + +static bool riscv_rpmi_addr_in_range(uint64_t addr, uint32_t len, + uint64_t base, uint64_t size) +{ + return len && size >=3D len && addr >=3D base && addr - base <=3D size= - len; +} + +static enum rpmi_error shmem_qemu_read(void *priv, rpmi_uint64_t addr, + void *buf, rpmi_uint32_t len) +{ + RiscvRpmiState *s =3D RISCV_RPMI(priv); + + if (!s || !buf || + !riscv_rpmi_addr_in_range(addr, len, s->shmem_base, + s->shmem_size)) { + return RPMI_ERR_BAD_RANGE; + } + + physical_memory_read(addr, buf, len); + return RPMI_SUCCESS; +} + +static enum rpmi_error shmem_qemu_write(void *priv, rpmi_uint64_t addr, + const void *buf, rpmi_uint32_t len) +{ + RiscvRpmiState *s =3D RISCV_RPMI(priv); + + if (!s || !buf || + !riscv_rpmi_addr_in_range(addr, len, s->shmem_base, + s->shmem_size)) { + return RPMI_ERR_BAD_RANGE; + } + + physical_memory_write(addr, buf, len); + return RPMI_SUCCESS; +} + +static enum rpmi_error shmem_qemu_fill(void *priv, rpmi_uint64_t addr, + char ch, rpmi_uint32_t len) +{ + RiscvRpmiState *s =3D RISCV_RPMI(priv); + + if (!s || + !riscv_rpmi_addr_in_range(addr, len, s->shmem_base, + s->shmem_size)) { + return RPMI_ERR_BAD_RANGE; + } + + while (len--) { + physical_memory_write(addr++, &ch, sizeof(ch)); + } + + return RPMI_SUCCESS; +} + +const struct rpmi_shmem_platform_ops rpmi_shmem_qemu_ops =3D { + .read =3D shmem_qemu_read, + .write =3D shmem_qemu_write, + .fill =3D shmem_qemu_fill, +}; + +static uint64_t riscv_rpmi_read(void *opaque, hwaddr offset, unsigned int = size) +{ + RiscvRpmiState *s =3D opaque; + + if (offset !=3D 0 || size !=3D 4) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid read at 0x%" HWADDR_PRIx " size %u\n", + __func__, offset, size); + return 0; + } + + return s->doorbell; +} + +static bool riscv_rpmi_transport_indices_valid(RiscvRpmiState *s); + +static void riscv_rpmi_write(void *opaque, hwaddr offset, uint64_t value, + unsigned int size) +{ + RiscvRpmiState *s =3D opaque; + + if (offset !=3D 0 || size !=3D 4) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid write at 0x%" HWADDR_PRIx " size %u\n", + __func__, offset, size); + return; + } + + s->doorbell =3D value; + + if (value =3D=3D 1) { + if (s->context && riscv_rpmi_transport_indices_valid(s)) { + rpmi_context_process_a2p_request(s->context); + rpmi_context_process_all_events(s->context); + } + s->doorbell =3D 0; + } +} + +static const MemoryRegionOps riscv_rpmi_ops =3D { + .read =3D riscv_rpmi_read, + .write =3D riscv_rpmi_write, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + +static bool riscv_rpmi_queue_indices_valid(RiscvRpmiState *s, + uint64_t queue_base, + uint32_t queue_size) +{ + uint8_t *shmem =3D memory_region_get_ram_ptr(&s->shmem); + uint32_t data_slots =3D queue_size / RPMI_QUEUE_SLOT_SIZE - 2; + uint32_t head; + uint32_t tail; + + head =3D ldl_le_p(shmem + queue_base); + tail =3D ldl_le_p(shmem + queue_base + RPMI_QUEUE_SLOT_SIZE); + if (head >=3D data_slots || tail >=3D data_slots) { + qemu_log_mask(LOG_GUEST_ERROR, + "%s: invalid queue indices head %u tail %u slots %u\= n", + __func__, head, tail, data_slots); + return false; + } + + return true; +} + +static bool riscv_rpmi_transport_indices_valid(RiscvRpmiState *s) +{ + if (!s->has_shmem || !s->a2p_req_size) { + return false; + } + + if (!riscv_rpmi_queue_indices_valid(s, 0, s->a2p_req_size)) { + return false; + } + + return riscv_rpmi_queue_indices_valid(s, s->a2p_req_size, + s->a2p_req_size); +} + +static void riscv_rpmi_configure_base(RiscvRpmiState *s, + const RiscvRpmiConfig *cfg) +{ + s->platform_info =3D g_strdup(cfg->platform_info); + s->services =3D cfg->services; + s->service_count =3D cfg->service_count; + + if (cfg->hart_count) { + s->hart_count =3D cfg->hart_count; + if (cfg->hart_ids) { + s->hart_ids =3D g_memdup2(cfg->hart_ids, + cfg->hart_count * sizeof(*cfg->hart_id= s)); + } + } +} + +static void riscv_rpmi_init(Object *obj) +{ + RiscvRpmiState *s =3D RISCV_RPMI(obj); + + memory_region_init_io(&s->mmio, obj, &riscv_rpmi_ops, s, + TYPE_RISCV_RPMI, RPMI_DBREG_SIZE); + sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio); +} + +static void riscv_rpmi_reset_hold(Object *obj, ResetType type) +{ + RiscvRpmiState *s =3D RISCV_RPMI(obj); + + s->doorbell =3D 0; + + if (s->has_shmem) { + memset(memory_region_get_ram_ptr(&s->shmem), 0, s->shmem_size); + memory_region_set_dirty(&s->shmem, 0, s->shmem_size); + } + +} + +static void riscv_rpmi_cleanup(RiscvRpmiState *s) +{ + + + if (s->context) { + rpmi_context_destroy(s->context); + s->context =3D NULL; + } + + if (s->transport) { + rpmi_transport_shmem_destroy(s->transport); + s->transport =3D NULL; + } + + if (s->rpmi_shmem) { + rpmi_shmem_destroy(s->rpmi_shmem); + s->rpmi_shmem =3D NULL; + } + + if (s->has_shmem) { + memory_region_del_subregion(get_system_memory(), &s->shmem); + s->has_shmem =3D false; + } +} + +bool riscv_rpmi_service_enabled(RiscvRpmiState *s, + enum rpmi_servicegroup_id service_group) +{ + uint32_t i; + + for (i =3D 0; i < s->service_count; i++) { + if (s->services[i].service_group =3D=3D service_group) { + return true; + } + } + + return false; +} + +static bool riscv_rpmi_validate_config(RiscvRpmiState *s, Error **errp) +{ + uint64_t queue_bytes; + + if (!s->shmem_size) { + error_setg(errp, "RPMI shared memory size must be non-zero"); + return false; + } + + if (s->shmem_base & (RPMI_QUEUE_SLOT_SIZE - 1)) { + error_setg(errp, "RPMI shared memory base must be %u-byte aligned", + RPMI_QUEUE_SLOT_SIZE); + return false; + } + + if (!s->a2p_req_size) { + error_setg(errp, "RPMI A2P request queue size must be non-zero"); + return false; + } + + if (!s->hart_count || !s->hart_ids) { + error_setg(errp, "RPMI transport requires hart IDs"); + return false; + } + + for (uint32_t i =3D 0; i < s->hart_count; i++) { + for (uint32_t j =3D i + 1; j < s->hart_count; j++) { + if (s->hart_ids[i] =3D=3D s->hart_ids[j]) { + error_setg(errp, "RPMI hart ID %u is duplicated", + s->hart_ids[i]); + return false; + } + } + } + + if (s->service_count && !s->services) { + error_setg(errp, "RPMI service count requires service descriptors"= ); + return false; + } + + if (s->a2p_req_size % RPMI_QUEUE_SLOT_SIZE) { + error_setg(errp, + "RPMI A2P request queue size must be a multiple of %u", + RPMI_QUEUE_SLOT_SIZE); + return false; + } + + if (s->p2a_req_size % RPMI_QUEUE_SLOT_SIZE) { + error_setg(errp, + "RPMI P2A request queue size must be a multiple of %u", + RPMI_QUEUE_SLOT_SIZE); + return false; + } + + queue_bytes =3D 2 * (uint64_t)s->a2p_req_size + + 2 * (uint64_t)s->p2a_req_size; + if (queue_bytes > s->shmem_size) { + error_setg(errp, + "RPMI shared memory size 0x%" PRIx64 + " is too small for queues 0x%" PRIx64, + s->shmem_size, queue_bytes); + return false; + } + + return true; +} + +static bool riscv_rpmi_add_service_group(RiscvRpmiState *s, + const RiscvRpmiServiceConfig *ser= vice, + Error **errp) +{ + error_setg(errp, "unsupported RPMI service group %u", + service->service_group); + return false; +} + +static bool riscv_rpmi_init_services(RiscvRpmiState *s, Error **errp) +{ + uint32_t i; + + for (i =3D 0; i < s->service_count; i++) { + if (!riscv_rpmi_add_service_group(s, &s->services[i], errp)) { + return false; + } + } + + return true; +} + +static bool riscv_rpmi_init_context(RiscvRpmiState *s, Error **errp) +{ + const char *platform_info =3D s->platform_info ?: RPMI_PLAT_INFO; + + s->rpmi_shmem =3D rpmi_shmem_create("rpmi-shmem", s->shmem_base, + s->shmem_size, + &rpmi_shmem_qemu_ops, s); + if (!s->rpmi_shmem) { + error_setg(errp, "failed to create RPMI shared memory backend"); + return false; + } + + s->transport =3D rpmi_transport_shmem_create("rpmi-shmem-transport", + RPMI_QUEUE_SLOT_SIZE, + s->a2p_req_size, + s->p2a_req_size, + s->rpmi_shmem); + if (!s->transport) { + error_setg(errp, "failed to create RPMI shared memory transport"); + return false; + } + + s->context =3D rpmi_context_create("rpmi-virt", s->transport, + RPMI_SRVGRP_ID_MAX_COUNT, + RPMI_PRIVILEGE_M_MODE, + strlen(platform_info) + 1, + platform_info); + if (!s->context) { + error_setg(errp, "failed to create RPMI context"); + return false; + } + + return riscv_rpmi_init_services(s, errp); +} + +static void riscv_rpmi_realize(DeviceState *dev, Error **errp) +{ + RiscvRpmiState *s =3D RISCV_RPMI(dev); + g_autofree char *name =3D NULL; + + if (!riscv_rpmi_validate_config(s, errp)) { + return; + } + + name =3D g_strdup_printf("rpmi-shmem@%" PRIx64, s->shmem_base); + if (!memory_region_init_ram(&s->shmem, OBJECT(dev), name, s->shmem_siz= e, + errp)) { + return; + } + + memory_region_add_subregion(get_system_memory(), s->shmem_base, &s->sh= mem); + s->has_shmem =3D true; + + if (!riscv_rpmi_init_context(s, errp)) { + riscv_rpmi_cleanup(s); + } +} + +static void riscv_rpmi_unrealize(DeviceState *dev) +{ + riscv_rpmi_cleanup(RISCV_RPMI(dev)); +} + +static const VMStateDescription riscv_rpmi_vmstate =3D { + .name =3D TYPE_RISCV_RPMI, + .unmigratable =3D 1, +}; + +static const Property riscv_rpmi_properties[] =3D { + DEFINE_PROP_UINT64("shmem-base", RiscvRpmiState, shmem_base, 0), + DEFINE_PROP_UINT64("shmem-size", RiscvRpmiState, shmem_size, 0), + DEFINE_PROP_UINT32("a2p-req-size", RiscvRpmiState, a2p_req_size, 0), + DEFINE_PROP_UINT32("p2a-req-size", RiscvRpmiState, p2a_req_size, 0), +}; + +static void riscv_rpmi_finalize(Object *obj) +{ + RiscvRpmiState *s =3D RISCV_RPMI(obj); + + g_free(s->platform_info); + g_free(s->hart_ids); +} + +static void riscv_rpmi_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + ResettableClass *rc =3D RESETTABLE_CLASS(klass); + + dc->realize =3D riscv_rpmi_realize; + dc->unrealize =3D riscv_rpmi_unrealize; + dc->vmsd =3D &riscv_rpmi_vmstate; + rc->phases.hold =3D riscv_rpmi_reset_hold; + device_class_set_props(dc, riscv_rpmi_properties); +} + +static const TypeInfo riscv_rpmi_info =3D { + .name =3D TYPE_RISCV_RPMI, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(RiscvRpmiState), + .instance_init =3D riscv_rpmi_init, + .instance_finalize =3D riscv_rpmi_finalize, + .class_init =3D riscv_rpmi_class_init, +}; + +static void riscv_rpmi_register_types(void) +{ + type_register_static(&riscv_rpmi_info); +} + +type_init(riscv_rpmi_register_types) + +DeviceState *riscv_rpmi_create(const RiscvRpmiConfig *cfg, Error **errp) +{ + DeviceState *dev; + RiscvRpmiState *s; + + if (!cfg) { + error_setg(errp, "missing RPMI configuration"); + return NULL; + } + + dev =3D qdev_new(TYPE_RISCV_RPMI); + qdev_prop_set_uint64(dev, "shmem-base", cfg->shmem_base); + qdev_prop_set_uint64(dev, "shmem-size", cfg->shmem_size); + qdev_prop_set_uint32(dev, "a2p-req-size", cfg->a2p_req_size); + qdev_prop_set_uint32(dev, "p2a-req-size", cfg->p2a_req_size); + + s =3D RISCV_RPMI(dev); + riscv_rpmi_configure_base(s, cfg); + + if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) { + return NULL; + } + + sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, cfg->doorbell_base); + return dev; +} diff --git a/hw/misc/riscv_rpmi_internal.h b/hw/misc/riscv_rpmi_internal.h new file mode 100644 index 0000000000..c0cb1b64e6 --- /dev/null +++ b/hw/misc/riscv_rpmi_internal.h @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI internal service helpers. + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#ifndef HW_MISC_RISCV_RPMI_INTERNAL_H +#define HW_MISC_RISCV_RPMI_INTERNAL_H + +#include "qapi/error.h" +#include "hw/misc/riscv_rpmi.h" +#include "librpmi.h" + +#define RPMI_PLAT_INFO "QEMU RISC-V RPMI" + +extern const struct rpmi_shmem_platform_ops rpmi_shmem_qemu_ops; +bool riscv_rpmi_service_enabled(RiscvRpmiState *s, + enum rpmi_servicegroup_id service_group); + +#endif diff --git a/include/hw/misc/riscv_rpmi.h b/include/hw/misc/riscv_rpmi.h new file mode 100644 index 0000000000..93d128f2e2 --- /dev/null +++ b/include/hw/misc/riscv_rpmi.h @@ -0,0 +1,95 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI definitions shared by RPMI transport and FDT helpers. + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#ifndef HW_MISC_RISCV_RPMI_H +#define HW_MISC_RISCV_RPMI_H + +#include "exec/hwaddr.h" +#include "hw/core/sysbus.h" +#include "qom/object.h" +#include "qemu/notify.h" + +#ifdef CONFIG_LIBRPMI +#include "librpmi.h" +#else +enum rpmi_servicegroup_id { + RPMI_SRVGRP_SYSTEM_RESET =3D 0x0003, + RPMI_SRVGRP_SYSTEM_SUSPEND =3D 0x0004, + RPMI_SRVGRP_HSM =3D 0x0005, +}; +#endif + +#define RPMI_QUEUE_SLOT_SIZE 64 +#define RPMI_DBREG_SIZE 0x1000 + +#define RPMI_ALL_NUM_QUEUES 4 +#define RPMI_A2P_NUM_QUEUES 2 +#define RPMI_ALL_NUM_REGS (RPMI_ALL_NUM_QUEUES + 1) +#define RPMI_A2P_NUM_REGS (RPMI_A2P_NUM_QUEUES + 1) + +#define VIRT_RPMI_A2P_REQ_SIZE (16 * RPMI_QUEUE_SLOT_SIZE) +#define VIRT_RPMI_P2A_REQ_SIZE 0 + + +#define TYPE_RISCV_RPMI "riscv-rpmi" +OBJECT_DECLARE_SIMPLE_TYPE(RiscvRpmiState, RISCV_RPMI) + +struct rpmi_context; +struct rpmi_service_group; +struct rpmi_shmem; +struct rpmi_transport; + +typedef struct RiscvRpmiServiceConfig { + const char *node_name; + const char *compatible; + enum rpmi_servicegroup_id service_group; + bool has_mpxy_channel; + uint32_t mpxy_channel; +} RiscvRpmiServiceConfig; + +typedef struct RiscvRpmiConfig { + hwaddr doorbell_base; + hwaddr shmem_base; + hwaddr shmem_size; + uint32_t a2p_req_size; + uint32_t p2a_req_size; + const char *platform_info; + + const uint32_t *hart_ids; + uint32_t hart_count; + const RiscvRpmiServiceConfig *services; + uint32_t service_count; +} RiscvRpmiConfig; + +struct RiscvRpmiState { + SysBusDevice parent_obj; + + MemoryRegion mmio; + MemoryRegion shmem; + uint64_t shmem_base; + uint64_t shmem_size; + uint32_t a2p_req_size; + uint32_t p2a_req_size; + char *platform_info; + + uint32_t *hart_ids; + uint32_t hart_count; + const RiscvRpmiServiceConfig *services; + uint32_t service_count; + uint32_t doorbell; + struct rpmi_shmem *rpmi_shmem; + struct rpmi_transport *transport; + struct rpmi_context *context; + bool has_shmem; +}; + +DeviceState *riscv_rpmi_create(const RiscvRpmiConfig *cfg, Error **errp); + +#endif --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916575; cv=none; d=zohomail.com; s=zohoarc; b=Xoh3RBuG2JU7YWsYOdmIwrX8L0lQd4s3LSMumr3cASORzdXCslVOLD/Xlc2W5lV+jtrIhVOTtPvHtOStgQPypPZhyUdOvjy67oO738NCnY3UXck0Pn9Vib+mmXcgmJ3cGd+O+6RqLHZR3pDa9YstQVn3MKUKhJd6fW8eI66ie2I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916575; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=c7RNdSqYVCAbHsYLsuQm5WluyL2z7ViFRVJaq8J+r9k=; b=iDx9TnP6EHqAmK9L1DoDJ25WbB71nMhngoAg/YUMaj8HDyV4pCX03TMBBs8oVHKPhZJIAM41Mwm48D5fbtnTonIv/8KNn5maMzNtRT5N29oOcy9QqugBzTqaNrGVrySpC2tn0DiXYgHJ4kB9vN7fv7QJMkH46ntjWDGx+H+X/Pg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916575800227.65388444719918; Fri, 28 Aug 2026 04:29:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzull-0001ok-II; Fri, 28 Aug 2026 07:29:13 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzuli-0001nM-Cj for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:11 -0400 Received: from mx0a-0031df01.pphosted.com ([205.220.168.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulg-0007d3-Da for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:10 -0400 Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA7nVW3306724 for ; Fri, 28 Aug 2026 11:29:07 GMT Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb42p9ck4-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:07 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38105cc58e1so237707a91.3 for ; Fri, 28 Aug 2026 04:29:06 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=c7RNdSqYVCA bHsYLsuQm5WluyL2z7ViFRVJaq8J+r9k=; b=AaCHdtNAOMssxu22H7AOgwi55n3 l09dnammnZho8Tvu3CNPekfYzG8P9EkvJMiCIVqLl5ir7FPB3tzc19Tp2lry3EEl CjRwE9UvRIX7PJJBOMzT/bgEIdeZhWOO9wrPbGgo902hSVUIFRbqalb3W+hDI8Ii j2alAFoNoqXI26w7QY+OjcbtEC1xXsnFH768cVBhHb2laxVc9d6dEW7rin3cuE4P dm0pPJk3ZYQkkNvOkLppp57RmTJyNuTEPqm/mnhrQRoZeGR0pkRoJcorZN43XHv+ CRiVJspxIBx8196MmxpnRoEwqhKUzIf9yh2e2fVyDAy/+Z5MMtF3+amFd8A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916546; x=1788521346; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=c7RNdSqYVCAbHsYLsuQm5WluyL2z7ViFRVJaq8J+r9k=; b=j8fZUYkpSHwOq/2cI5h3J/IuP1IzOJKW01p8IPG7/xJ8KCK9YX5ncnegMHm0FFXaoG JQprhIGopqkLS+4I++Z6najsLVoARX+ZrDMYScvJf8KXAfewUU3P5ZirZGUjqrkzBsxh oGWGFFvVzTstBTx+Fr2rz62l7WuGoPxDUu7RiaNh0Q/gQGE6a1nJqxiM4oZVzcsccbko F+25eQLMhHctU66Wbka956rRsTCByu3NDB0qFF92rrQl7/P4zh/plQpnQjU7dp7/gqhQ n5ZuPpW56/r/YWDqkDo5mgsC3gXTpkOyecoLkQHmABayJV26448H6OR75AZV95Nh68kL PFyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916546; x=1788521346; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=c7RNdSqYVCAbHsYLsuQm5WluyL2z7ViFRVJaq8J+r9k=; b=iNkI3gd5Z+4RrAHZb/Ogfhcirjbi/YKYj3fgmDcXGnCh7U3xMdxC8VKkznuuleHVNS BdicxG3TrSFbNNxM3Y/8runsRezigvPN/XKikyV4X8FyzpSvsc+x9tGqTunMPZIi7yNL CkZJUPd1bW5CV2WewVJLyJFMZo7UVM+U7AAtZLOb4l1cuQN4qZZ/KOFcz9+PDLkUPGP4 lZaVTHcuGGgRAnOoo8CYw8C9h0+vWuI3IZd3lZn/Q3skAGmhkVrDkktY7wYuwZHNd/11 egvMApoXkSeriQjDZmoUCNOmMdynsy93XzBJp1VXZWQdf7Rc4p6SOkt/ZhHNLU2K0Lwa ML9Q== X-Gm-Message-State: AFuF++k5Zm/LRisdIB69JwxppuPIlUXYKKSMqweK5O11YtftWqkY8jtj vRoUm9PgDYnRjfTC5A0jyBPLnIxNRaJzVf1+rZKuGxYahJ0qNk1KFS4YMOAlD2rzG02xoMAMu+M iUos/3hAJdUamPKDXtW4znGXkTCQmoXnYetlCxT1hQaQ0UAn5/5XCv2lN/1ebKaAfiw== X-Gm-Gg: AR+sD13wf7RSSIXBOCyLhEhcjkqXoKStUWXFgRYBjis45TdbbmaCioJzAc4IyCyLCEB 8o5d8r5Nj+8y+rHC/fIfz2pPKiXIorOLK3yOfyT2lDOWq4UiFQDBesbAhPXmtaU3ZhAZMK4ODH9 tX9WG/+27EAhSk+TUogh5u4S2s/rjjpisJBldyM61wXL4lBvZquIPW4SpnZPLWxfpsoyyI9y4O/ UIRZ8z+y2UZ+sBevNOIu7TsqzxlEgDTPiCpB0giBTebYMHju7aJ5W915GUUnCtTrfMsHqNXIrXE V7a6Ap6c10IiCRCIDaqHpJz+pkHcKryCYJmoFDGbKMg35K6DTXflKj/V2V1Qlyb+tF8DCk0aNwA Ky5OXeyhXF4TRAezo/r9k5eYdB+zJpPe0qeqyH3bgI7nkOsrmnQR8y9/MoL+96/2wozYo4qfA7e hLlPR70FV+uaQjaVmKLvdyefX9YMBh2pI= X-Received: by 2002:a17:90b:3c47:b0:38e:ab3f:2c99 with SMTP id 98e67ed59e1d1-396d0ee934emr6311498a91.2.1787916546283; Fri, 28 Aug 2026 04:29:06 -0700 (PDT) X-Received: by 2002:a17:90b:3c47:b0:38e:ab3f:2c99 with SMTP id 98e67ed59e1d1-396d0ee934emr6311424a91.2.1787916545840; Fri, 28 Aug 2026 04:29:05 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Daniel Henrique Barboza , Palmer Dabbelt , Alistair Francis , Weiwei Li , Liu Zhiwei , Chao Liu Subject: [PATCH v10 03/10] hw/riscv: add RPMI FDT helpers Date: Fri, 28 Aug 2026 16:57:55 +0530 Message-ID: <20260828112803.86636-4-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: k2LtmPqzp27HkQ_BbW8cpRhgoipBwlx6 X-Authority-Analysis: v=2.4 cv=ToDWQjXh c=1 sm=1 tr=0 ts=6a917103 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=WNJofZAcfibaGo0vQRIA:9 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-GUID: k2LtmPqzp27HkQ_BbW8cpRhgoipBwlx6 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX7ZbDj9ER3N5f JCdLqMOCeYArKFsKJWJ62MS4+NiPnCawgy654PF1xdturzfkbUkuHgwR3kvj7yl4TKJaQYc8OXK Li4m+eVIQ8IjemyIPVAqDuauAa6HYdI= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX5Oj5YF58k6if uF7zIngfOiTHhPNE7tWdJUAe1+qmHvUJYhBeBUNEgMaby2AxHs0IRYpkKQcrzdLcIMVyELg2ii4 iaOSwKxINL2Ik/wc5q2Rgm2/tiX2JzngOAFvz7A0H1csH3xYeoq8XZKq4f2omyjvlYWVbim7B8O QAlMLsIKou+IELbkUFbntk0IRXYMy67u3VrwLOtwR9S554zZ+jP97NvhVX4J2U2P9OSl4WLrDwV dIJcs6pX3wdvs1QThc/Porp8Xqu1KoY84zZwn7yZRZKJT5bNYXQRQ8t10ZmCRphaMiQZzPde3il /vIji0R7pPCe1KQc1gNaHLmz9Wfzydkdy+BfZ2Ty6lrDvRMvgv/UVUVbPkI9gqxPQKy8a1k3bzf EVhVMSumKmP+PjXwpcRgquVAjzNN9/HJR7JHw+HttwLc13obYLo2wxT+sFNp7kfpcSguHKCgF3D 4jvW60xjOMN7u0epvJg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 adultscore=0 impostorscore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 phishscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.168.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0a-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916578631154100 Content-Type: text/plain; charset="utf-8" Add helper routines for describing RPMI shared-memory mailbox transports and service child nodes in the RISC-V virt device tree. The helpers keep RPMI node construction in one place so the virt machine can add service groups without open-coding compatible strings, channel IDs, interrupts, and shared-memory references at each call site. Signed-off-by: Subrahmanya Lingappa Reviewed-by: Daniel Henrique Barboza --- hw/riscv/meson.build | 3 ++ hw/riscv/rpmi-fdt-stub.c | 16 ++++++ hw/riscv/rpmi-fdt.c | 103 ++++++++++++++++++++++++++++++++++++ include/hw/riscv/rpmi-fdt.h | 30 +++++++++++ 4 files changed, 152 insertions(+) create mode 100644 hw/riscv/rpmi-fdt-stub.c create mode 100644 hw/riscv/rpmi-fdt.c create mode 100644 include/hw/riscv/rpmi-fdt.h diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 0d82ceacc4..87601f8523 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -4,6 +4,9 @@ riscv_ss.add(files('boot.c')) riscv_ss.add(files('fdt-common.c')) riscv_ss.add(when: 'CONFIG_RISCV_NUMA', if_true: files('numa.c')) riscv_ss.add(files('riscv_hart.c')) +riscv_ss.add(when: 'CONFIG_RISCV_RPMI', + if_true: files('rpmi-fdt.c'), + if_false: files('rpmi-fdt-stub.c')) riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c')) riscv_ss.add(when: 'CONFIG_RISCV_VIRT', if_true: files('virt.c')) riscv_ss.add(when: 'CONFIG_SHAKTI_C', if_true: files('shakti_c.c')) diff --git a/hw/riscv/rpmi-fdt-stub.c b/hw/riscv/rpmi-fdt-stub.c new file mode 100644 index 0000000000..9866236ab3 --- /dev/null +++ b/hw/riscv/rpmi-fdt-stub.c @@ -0,0 +1,16 @@ +/* + * RISC-V RPMI device-tree helper stubs. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "hw/riscv/rpmi-fdt.h" + +void riscv_rpmi_fdt_add_mbox(void *fdt G_GNUC_UNUSED, + const RiscvRpmiFdtMboxConfig *cfg G_GNUC_UNUS= ED, + uint32_t *phandle G_GNUC_UNUSED, + uint32_t *mbox_handle G_GNUC_UNUSED) +{ + g_assert_not_reached(); +} diff --git a/hw/riscv/rpmi-fdt.c b/hw/riscv/rpmi-fdt.c new file mode 100644 index 0000000000..439c91c894 --- /dev/null +++ b/hw/riscv/rpmi-fdt.c @@ -0,0 +1,103 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI device-tree helpers + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#include "qemu/osdep.h" +#include "qemu/bswap.h" +#include "hw/riscv/rpmi-fdt.h" +#include "hw/misc/riscv_rpmi.h" +#include "system/device_tree.h" + +void riscv_rpmi_fdt_add_mbox(void *fdt, + const RiscvRpmiFdtMboxConfig *cfg, + uint32_t *phandle, + uint32_t *mbox_handle) +{ + g_autofree char *name =3D NULL; + hwaddr a2p_req_base, p2a_ack_base, p2a_req_base, a2p_ack_base; + static const char * const regnames_all[RPMI_ALL_NUM_REGS] =3D { + "a2p-req", "p2a-ack", "p2a-req", "a2p-ack", "a2p-doorbell" + }; + static const char * const regnames_a2p[RPMI_A2P_NUM_REGS] =3D { + "a2p-req", "p2a-ack", "a2p-doorbell" + }; + + a2p_req_base =3D cfg->shmem_base; + p2a_ack_base =3D a2p_req_base + cfg->a2p_req_size; + p2a_req_base =3D p2a_ack_base + cfg->a2p_req_size; + a2p_ack_base =3D p2a_req_base + cfg->p2a_req_size; + + *mbox_handle =3D (*phandle)++; + name =3D g_strdup_printf("/soc/mailbox@%" HWADDR_PRIx, cfg->shmem_base= ); + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", "riscv,rpmi-shmem-mbo= x"); + qemu_fdt_setprop_cell(fdt, name, "riscv,slot-size", RPMI_QUEUE_SLOT_SI= ZE); + qemu_fdt_setprop_cell(fdt, name, "#mbox-cells", 1); + + if (cfg->p2a_req_size) { + qemu_fdt_setprop_string_array(fdt, name, "reg-names", + (char **)®names_all, + ARRAY_SIZE(regnames_all)); + qemu_fdt_setprop_cells(fdt, name, "reg", + (uint32_t)(a2p_req_base >> 32), (uint32_t)a2p_req_base, + 0x0, cfg->a2p_req_size, + (uint32_t)(p2a_ack_base >> 32), (uint32_t)p2a_ack_base, + 0x0, cfg->a2p_req_size, + (uint32_t)(p2a_req_base >> 32), (uint32_t)p2a_req_base, + 0x0, cfg->p2a_req_size, + (uint32_t)(a2p_ack_base >> 32), (uint32_t)a2p_ack_base, + 0x0, cfg->p2a_req_size, + (uint32_t)(cfg->doorbell_base >> 32), (uint32_t)cfg->doorbell_= base, + 0x0, cfg->doorbell_size); + } else { + qemu_fdt_setprop_string_array(fdt, name, "reg-names", + (char **)®names_a2p, + ARRAY_SIZE(regnames_a2p)); + qemu_fdt_setprop_cells(fdt, name, "reg", + (uint32_t)(a2p_req_base >> 32), (uint32_t)a2p_req_base, + 0x0, cfg->a2p_req_size, + (uint32_t)(p2a_ack_base >> 32), (uint32_t)p2a_ack_base, + 0x0, cfg->a2p_req_size, + (uint32_t)(cfg->doorbell_base >> 32), (uint32_t)cfg->doorbell_= base, + 0x0, cfg->doorbell_size); + } + + qemu_fdt_setprop_cells(fdt, name, "phandle", *mbox_handle); +} + +void riscv_rpmi_fdt_add_service(void *fdt, hwaddr shmem_base, + const char *node_name, + const char *compatible, + uint32_t mbox_handle, + uint32_t service_group, + bool has_mpxy_channel, + uint32_t mpxy_channel) +{ + g_autofree char *name =3D g_strdup_printf("/soc/mailbox@%" HWADDR_PRIx= "/%s", + shmem_base, node_name); + + qemu_fdt_add_subnode(fdt, name); + qemu_fdt_setprop_string(fdt, name, "compatible", compatible); + qemu_fdt_setprop_cells(fdt, name, "mboxes", mbox_handle, service_group= ); + if (has_mpxy_channel) { + qemu_fdt_setprop_cell(fdt, name, "riscv,sbi-mpxy-channel-id", + mpxy_channel); + } +} + +void riscv_rpmi_fdt_add_service_node(void *fdt, hwaddr shmem_base, + const RiscvRpmiServiceConfig *service, + uint32_t mbox_handle) +{ + riscv_rpmi_fdt_add_service(fdt, shmem_base, service->node_name, + service->compatible, mbox_handle, + service->service_group, + service->has_mpxy_channel, + service->mpxy_channel); +} diff --git a/include/hw/riscv/rpmi-fdt.h b/include/hw/riscv/rpmi-fdt.h new file mode 100644 index 0000000000..b157bda1d1 --- /dev/null +++ b/include/hw/riscv/rpmi-fdt.h @@ -0,0 +1,30 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI device-tree helpers + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#ifndef HW_RISCV_RPMI_FDT_H +#define HW_RISCV_RPMI_FDT_H + +#include "exec/hwaddr.h" +#include "hw/misc/riscv_rpmi.h" + +typedef struct RiscvRpmiFdtMboxConfig { + hwaddr shmem_base; + hwaddr doorbell_base; + uint32_t a2p_req_size; + uint32_t p2a_req_size; + uint32_t doorbell_size; +} RiscvRpmiFdtMboxConfig; + +void riscv_rpmi_fdt_add_mbox(void *fdt, + const RiscvRpmiFdtMboxConfig *cfg, + uint32_t *phandle, + uint32_t *mbox_handle); + +#endif --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916597; cv=none; d=zohomail.com; s=zohoarc; b=Qqa/HnkPUUH5wLwOta8ZFNyWRsHhLArlXWqBMKE9WafGG45uwASs+z6agMUXnmo77ey6oSoQlI8YE2NzClCrPxlGVnttSsZW5n2HQBidiPkWdMUxaUcZeqZg3fOrb1R7C7xZsbEAP1Hv/p7/f3Cs3ljkfcO9RVvk0PCknx1nKXM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916597; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=lHIoXuNYkoboNA5wZwffhhnpzE/5bvPgEzcsOazaxgU=; b=cifYhGFh9BP73WlG7N++JA7TgucgqEiU3Dsb8dJhvRL79aZ9HVBjqg9E+TTVGG6K8QInQcn439lWYLn2JyV+/GHAXbv1FvyG0M5OwZ90rTMwGd+Uu2s2DSsLi3D/YuIjWXTAfSKZ7qOTbBJr9KjX1mIqcQ3j7uR/2F/Yqcd/uJs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916597980798.036806969632; Fri, 28 Aug 2026 04:29:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzulo-0001sE-7U; Fri, 28 Aug 2026 07:29:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulm-0001qF-Di for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:14 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulk-0007ew-GA for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:14 -0400 Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA88QY2596139 for ; Fri, 28 Aug 2026 11:29:11 GMT Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb1v39yh1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:11 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-38dc0eee75dso290533a91.0 for ; Fri, 28 Aug 2026 04:29:11 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=lHIoXuNYkob oNA5wZwffhhnpzE/5bvPgEzcsOazaxgU=; b=ELMBJmDTvnJgtDsqmdhwdvdB0KV 4KHZuqMmb9JW5cbYvm6q0ZDb1kJ5m2x8oGgTvJhr0QiXAxXjshyZdVlJFEi5JXCv qaMjtWx7R9qbGBol/Ro/vob49psd6w6flZpGYSlOnnkDtnk5150Co4lTsPCq/Sq8 N9HNzGcsKyg70mcFH0+cce1uoPRT0rxu/niYyqhwuptNpSNqL0XRqTdyLdlRaoZd 4nxdZtw4lRwLGNUJ0xdkmehRYfh1y2J9p0bElPcQ2peQk8iDdvew0NUTQB5NXEGr +iJ+ooaDB9ZMC9GWYfDLYspFkDd4rjsCE2yPWAqlDA2e0ZEC+Dff0EcCbbg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916550; x=1788521350; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=lHIoXuNYkoboNA5wZwffhhnpzE/5bvPgEzcsOazaxgU=; b=ahWEUwR46/Q+kv6mlX2RyW1vGBeT8+po5nIqMTT7iALeAU4BO+cqqSw4fFFluvF3Fn uBt98rfaxya5tpaPDtNRp9tDZVyvJnZOYWB+v3vp5APuDJrg60QlZE8x2g9r/xkGWznG qe/kETK9rDFq8rFIPNLWOAeSwPu1Ice03xV9N29UeVDptSCobGZNNw9GbfdQc3lx8t9o UeeJUAM5yydkos4mRCQt9KWuW+rghb9XIXnRrLpz62qZ4qmQUAW364azD+vJSjh4ax8B HKIx2r6QzJS2a7XImkevHn+volfGaDt5QRuwSYhTzKvCkeuZ2jmel/cbweKOo3zqyJX5 OH+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916550; x=1788521350; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=lHIoXuNYkoboNA5wZwffhhnpzE/5bvPgEzcsOazaxgU=; b=eDB0BNFHLaCnh9RGgsbbodA8jM521M439csfHNE8+a0FShYEJxtAhP7OFdiDqSyKjn x1wvFqJNus0a4kGXWYFdvXpSB7IwV+8U2Dsc758ppLMET6Ff+Cili5eGzqLqhJYV8p8l w3mn0hCkCY+t6eESpGCP9b3IBLhtpLAiyGE6wSeXXlSkmj2/ByZHJbYpMnvLWVGFUllE m08miJoo+l/PZ0jMPZCKt6kIks1pT6nuCB47GVEXdfSJgIxLmqOTCRb+zt+KTYhpoI1X L2pqv70Wrp0DVMLb569XdIlG6FicedIe36KITGLE9MPgCZTfAR05SjB+3ih6l/EzxzKx NbQQ== X-Gm-Message-State: AFuF++lvpRPMuj2P5oZsAmrbi3QwBvZ228G5t5rTghyyRog9s+MdvltI cAUCfKOa7SWWQmj+hb1UDHAbpeO67Y98p/f3d34FpPaExHJNj9qLwj6gFADgm5sbRG9nFJHglt0 uftqXZSdcUA+qa9d2pIEwW0fuJZZxRpkxRRALJRoezLUkH3VV6+sQH9rPMOJe13VvLg== X-Gm-Gg: AR+sD11uCq7Ml/RQJtNNDRxQV9mI8rGjpK98gaNl8yO0eGqfZnLPJJEDwdfhc6OCj6m gRQVD7pCvRxISk1ONr394mvL7tsEwlZiBF+DACIBkCOJ2KhMtgrve3+ct8nK8no7bgO4EYMOGuH 7iLcJmFITL4u1IDFWDJ8bnOOafeiWugnvVI5aEtjmqyLHFJ5LYjv1YDzgS45No8CQQuxI2UHgVY a2RhpS5dHYNcQZTNBbnWqubdQ2YRQ1XxplZ6GqaREnOoN3cTFWBLYLs1z4AvUYeU0WlqhZJmAW9 Bg3gQfWVjIp5ZNX9n5/xED1OQxqxQvHFRMbrdhLJvB/UHiCza6VmFgKuVmD81SxOF7IolFpO/tG CJ6U6wDMg1OR4wSxGLXIM6NJjMFOJvQYC2Kx/qgVNaPIhzDmdYkLtD7M8bD9zjgBhJhvMTwzSvo U9UykEwaFIJlJAWSHBa3irBCtXMXSOQiE= X-Received: by 2002:a17:903:1106:b0:2d7:1a3f:8db5 with SMTP id d9443c01a7336-2d74e0c729bmr54312505ad.4.1787916550240; Fri, 28 Aug 2026 04:29:10 -0700 (PDT) X-Received: by 2002:a17:903:1106:b0:2d7:1a3f:8db5 with SMTP id d9443c01a7336-2d74e0c729bmr54312155ad.4.1787916549809; Fri, 28 Aug 2026 04:29:09 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Paolo Bonzini , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Chao Liu Subject: [PATCH v10 04/10] hw/riscv/virt: add opt-in RPMI base support Date: Fri, 28 Aug 2026 16:57:56 +0530 Message-ID: <20260828112803.86636-5-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX9Y7QWm086oQw wtiMgJvmWQKSm0+ggF/kCRXqDsmTrKf0cvYKBNykbxkI0BqF3prgueNawUxBB66q1P0Csomg4At ZdQ0jHCJFuiBiaziWH408of7BjPS0TTEf4EkyI5jwprLWL3dUo9yQTXmYtfG/KzdY+006d0ksFo yi5HvtW68RhmTqz9eLtjzbGs1tWE5vw/YEI0OXePrW6R8wDiazPUWNhooUuViP/DKQR5fcfeW2x ePxqddc5aKVYf9rmH8By3WbWqPNXvzlBCPupB3N91Zo0yH/P6SL++X6bOUHY9DONoMEkYojlHCh YX5hr//22+1CxYB/WOFGa1GqPBXvCoBHgtc9XNBj2b/HjM7NfiNigelsmjJvcxJkRq1yNJ4s+oB xRJc267BowRmUZHPEj5vbTM6AXEXH7FMkHT+XVKPGtzLbkr1nkOWG74+fA4nXJN5w2y4OOng3Zq TgIXMVMAol9fQ0o5NpQ== X-Proofpoint-ORIG-GUID: rGmd8KqPGxzCqDG-Z5EsB7x5IGit2jrV X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX1nFfncsYfnvV IHVCqCDraeYO4ca3/aTXM/NLWmBnjJ2ThPUyERn70PQdZUpGEA7Lu3pYF21nNBjAG21Ng60fN0Y A4Ci/ccQxtmfcyIH3NygSxD7Hl9j+ws= X-Authority-Analysis: v=2.4 cv=faedDUQF c=1 sm=1 tr=0 ts=6a917107 cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=CvjZw6EAnlyfa7EY1UoA:9 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-GUID: rGmd8KqPGxzCqDG-Z5EsB7x5IGit2jrV X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 priorityscore=1501 phishscore=0 spamscore=0 impostorscore=0 lowpriorityscore=0 suspectscore=0 adultscore=0 malwarescore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916599331158500 Content-Type: text/plain; charset="utf-8" Add the virt machine rpmi=3Don/off option and wire the initial RPMI Base transport into machine realization. The option remains disabled by default and requires TCG plus librpmi. Invalid accelerator/build combinations fail during machine initialization. When enabled, virt allocates the RPMI shared-memory transport, creates the RPMI device, configures Base service metadata, and emits the corresponding device-tree nodes for firmware discovery. Signed-off-by: Subrahmanya Lingappa --- hw/riscv/Kconfig | 1 + hw/riscv/virt.c | 96 +++++++++++++++++++++++++++++++++++++++++ include/hw/riscv/virt.h | 3 ++ 3 files changed, 100 insertions(+) diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index d06ac26648..c3f9d7580b 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -49,6 +49,7 @@ config RISCV_VIRT imply VIRTIO_VGA imply TEST_DEVICES imply TPM_TIS_SYSBUS + imply RISCV_RPMI select DEVICE_TREE select RISCV_NUMA select GOLDFISH_RTC diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index d58656f70d..c822cc15ca 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -44,6 +44,8 @@ #include "hw/intc/riscv_aplic.h" #include "hw/intc/sifive_plic.h" #include "hw/misc/sifive_test.h" +#include "hw/misc/riscv_rpmi.h" +#include "hw/riscv/rpmi-fdt.h" #include "hw/core/platform-bus.h" #include "chardev/char.h" #include "system/device_tree.h" @@ -100,6 +102,8 @@ static const MemMapEntry virt_memmap[] =3D { /* UART1 supports page isolation from UART0 */ [VIRT_UART1] =3D { 0x1000a000, 0x100 }, [VIRT_FW_CFG] =3D { 0x10100000, 0x18 }, + [VIRT_RPMI_SHMEM] =3D { 0x10200000, 0x20000 }, + [VIRT_RPMI_DOORBELL] =3D { 0x10230000, 0x1000 }, [VIRT_FLASH] =3D { 0x20000000, 0x4000000 }, [VIRT_IMSIC_M] =3D { 0x24000000, VIRT_IMSIC_MAX_SIZE }, [VIRT_IMSIC_S] =3D { 0x28000000, VIRT_IMSIC_MAX_SIZE }, @@ -988,6 +992,40 @@ static void create_fdt_iommu(RISCVVirtState *s, uint16= _t bdf) s->pci_iommu_bdf =3D bdf; } =20 + +static RiscvRpmiConfig virt_rpmi_config(RISCVVirtState *s, + const uint32_t *hart_ids, + uint32_t hart_count) +{ + return (RiscvRpmiConfig) { + .doorbell_base =3D s->memmap[VIRT_RPMI_DOORBELL].base, + .shmem_base =3D s->memmap[VIRT_RPMI_SHMEM].base, + .shmem_size =3D s->memmap[VIRT_RPMI_SHMEM].size, + .a2p_req_size =3D VIRT_RPMI_A2P_REQ_SIZE, + .p2a_req_size =3D VIRT_RPMI_P2A_REQ_SIZE, + .platform_info =3D "QEMU RISC-V virt RPMI", + .hart_ids =3D hart_ids, + .hart_count =3D hart_count, + }; +} + +static void create_fdt_rpmi(RISCVVirtState *s, uint32_t *phandle, + uint32_t msi_phandle) +{ + RiscvRpmiConfig rpmi_cfg =3D virt_rpmi_config(s, NULL, 0); + uint32_t rpmi_mbox_handle; + RiscvRpmiFdtMboxConfig cfg =3D { + .shmem_base =3D rpmi_cfg.shmem_base, + .doorbell_base =3D rpmi_cfg.doorbell_base, + .a2p_req_size =3D rpmi_cfg.a2p_req_size, + .p2a_req_size =3D rpmi_cfg.p2a_req_size, + .doorbell_size =3D s->memmap[VIRT_RPMI_DOORBELL].size, + }; + + riscv_rpmi_fdt_add_mbox(MACHINE(s)->fdt, &cfg, phandle, + &rpmi_mbox_handle); +} + static void finalize_fdt(RISCVVirtState *s) { uint32_t phandle =3D 1, irq_mmio_phandle =3D 1, msi_pcie_phandle =3D 1; @@ -1007,6 +1045,10 @@ static void finalize_fdt(RISCVVirtState *s) create_fdt_pcie(s, irq_pcie_phandle, msi_pcie_phandle, iommu_sys_phandle); =20 + if (s->have_rpmi) { + create_fdt_rpmi(s, &phandle, msi_pcie_phandle); + } + create_fdt_reset(s, &phandle); =20 create_fdt_uarts(s, irq_mmio_phandle); @@ -1334,6 +1376,18 @@ static void virt_machine_init(MachineState *machine) exit(1); } =20 + + if (s->have_rpmi) { +#ifndef CONFIG_LIBRPMI + error_report("RISC-V RPMI support is not compiled in"); + exit(1); +#else + if (kvm_enabled()) { + error_report("RISC-V RPMI support is not available with KVM"); + exit(1); + } +#endif + } /* Initialize sockets */ mmio_irqchip =3D virtio_irqchip =3D pcie_irqchip =3D NULL; for (i =3D 0; i < socket_count; i++) { @@ -1484,6 +1538,25 @@ static void virt_machine_init(MachineState *machine) /* SiFive Test MMIO device */ sifive_test_create(s->memmap[VIRT_TEST].base); =20 + if (s->have_rpmi) { + MachineClass *mc =3D MACHINE_GET_CLASS(machine); + const CPUArchIdList *possible_cpus =3D mc->possible_cpu_arch_ids(m= achine); + g_autofree uint32_t *rpmi_hart_ids =3D + g_new0(uint32_t, machine->smp.cpus); + RiscvRpmiConfig rpmi_cfg; + Error *local_err =3D NULL; + + for (i =3D 0; i < machine->smp.cpus; i++) { + rpmi_hart_ids[i] =3D possible_cpus->cpus[i].arch_id; + } + + rpmi_cfg =3D virt_rpmi_config(s, rpmi_hart_ids, machine->smp.cpus); + if (!riscv_rpmi_create(&rpmi_cfg, &local_err)) { + error_report_err(local_err); + exit(1); + } + } + /* VirtIO MMIO devices */ for (i =3D 0; i < VIRTIO_COUNT; i++) { sysbus_create_simple("virtio-mmio", @@ -1575,6 +1648,7 @@ static void virt_machine_instance_init(Object *obj) =20 s->oem_id =3D g_strndup(ACPI_BUILD_APPNAME6, 6); s->oem_table_id =3D g_strndup(ACPI_BUILD_APPNAME8, 8); + s->have_rpmi =3D false; s->acpi =3D ON_OFF_AUTO_AUTO; s->iommu_sys =3D ON_OFF_AUTO_AUTO; s->num_sources =3D VIRT_IRQCHIP_NUM_SOURCES; @@ -1650,6 +1724,21 @@ static void virt_set_aclint(Object *obj, bool value,= Error **errp) s->have_aclint =3D value; } =20 + +static bool virt_get_rpmi(Object *obj, Error **errp) +{ + RISCVVirtState *s =3D RISCV_VIRT_MACHINE(obj); + + return s->have_rpmi; +} + +static void virt_set_rpmi(Object *obj, bool value, Error **errp) +{ + RISCVVirtState *s =3D RISCV_VIRT_MACHINE(obj); + + s->have_rpmi =3D value; +} + bool virt_is_iommu_sys_enabled(RISCVVirtState *s) { return s->iommu_sys =3D=3D ON_OFF_AUTO_ON; @@ -1771,6 +1860,13 @@ static void virt_machine_class_init(ObjectClass *oc,= const void *data) "enable/disable emulating " "ACLINT devices"); =20 + + object_class_property_add_bool(oc, "rpmi", virt_get_rpmi, + virt_set_rpmi); + object_class_property_set_description(oc, "rpmi", + "Set on/off to enable/disable " + "RISC-V RPMI devices"); + object_class_property_add_str(oc, "aia", virt_get_aia, virt_set_aia); object_class_property_set_description(oc, "aia", diff --git a/include/hw/riscv/virt.h b/include/hw/riscv/virt.h index 7c862b0da2..76b5a57001 100644 --- a/include/hw/riscv/virt.h +++ b/include/hw/riscv/virt.h @@ -55,6 +55,7 @@ struct RISCVVirtState { =20 int fdt_size; bool have_aclint; + bool have_rpmi; RISCVVirtAIAType aia_type; int aia_guests; char *oem_id; @@ -82,6 +83,8 @@ enum { VIRT_VIRTIO, VIRT_UART1, VIRT_FW_CFG, + VIRT_RPMI_SHMEM, + VIRT_RPMI_DOORBELL, VIRT_IMSIC_M, VIRT_IMSIC_S, VIRT_FLASH, --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916591; cv=none; d=zohomail.com; s=zohoarc; b=D5Qge/f0ggssfKn/yp8j95EScOZgW3fnCMzLQASZ0uyOHDnKqanOOjp0YHQqZ25JZk7FdPSZp3yLKU6ID6RK7fh3Rqy8yLpXqKcXAWQExkkMxkr1IdQbsrK+43WfEzujLH1hXt36RUfHqr7d66RmvPMqScFLF2i48Z1Sv9gVeEM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916591; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=7Iq62zuVlHNyzdfZz54PdG5FxvGB5ZjytL/kcBmgOy0=; b=ZPBCxqPim5yeLCPEEhhSrr1DmUzS5bANrGOsoBCOjbJyPWujoOV/d08iN+SA7b0Tlk1l6AqprbJQ1p/5ypP1uNH2kN5YxjfPeHwyIUfq9hRV2+Rm8oSDhwBhq/7tS4H+UN99eefXwTLptd8K6v8lKJfO51hLJsg6r+sipuzMcaU= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916591305897.7946359577961; Fri, 28 Aug 2026 04:29:51 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzuls-0001tz-Jt; Fri, 28 Aug 2026 07:29:20 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulr-0001ta-Hh for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:19 -0400 Received: from mx0a-0031df01.pphosted.com ([205.220.168.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulo-0007h7-N4 for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:19 -0400 Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA7k3e3306368 for ; Fri, 28 Aug 2026 11:29:15 GMT Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb42p9ckg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:15 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-38ddc70b9d5so240618a91.3 for ; Fri, 28 Aug 2026 04:29:15 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=7Iq62zuVlHN yzdfZz54PdG5FxvGB5ZjytL/kcBmgOy0=; b=lXRQRGEUYPus2hww+IAj+8knb/t 1nriURPPjJvWigd7pkUin9e5kiKCTTI8G4kGI9b9GcLmYkdwOGySJ0BO1MdtR7PA R0VsTEI784bXAkldGw8eHEb7Wnd5NKvfBCPHCZgAyM0nv7gdDtjubpW0SSMrR7MI khkojnDvOEdm4MLQlt0sNlkSOAJ2uNOoq1WlfRMRyYNCCQj7ZHo+equUA8q1uV7v /yOAfMlAvsMDmDDko9sMxSQoj0bRcp0oOPAHOxom1l6gweZhk9w19WK8VygAz9Bp T0+XPHxSSCwmsIKr4d2Av/p8vySMkQ/QHNMdBHKXJ9bffevJ6A1X2OSV2qg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916555; x=1788521355; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=7Iq62zuVlHNyzdfZz54PdG5FxvGB5ZjytL/kcBmgOy0=; b=Ufax/RouIMwqzUVc9XRAOkgg7LdZI5b4nzNQXcmqLKzVZCKx4Xa2wqnDh2dStvMu4v pcDgTpGvU+tFgKutCaX06KCw81l93el4hPJC5lGqo7t3dWi28F+ytvJ06vNhJsDcPu/7 5XsdeMKrB/BPCjS5Q/+h5QkFBdKH7W2gW3YDZnrwB/geWgYvUoX0Rs8/ArXOciB20/h+ sxPyzhqzifbn1fLdJ72BD0HpBmrZbmVrb5KOajihCLh3cdabG+EaA5Oz0F8nNcVRNPjb Xe9xtqArChKhVsFmsi4TqKENwVvuXtkN1cPSZQW2VC1kbRAbS+9XPvdSC3qpGXLyarO/ wxGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916555; x=1788521355; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=7Iq62zuVlHNyzdfZz54PdG5FxvGB5ZjytL/kcBmgOy0=; b=Yj3H31dJbf/RacPIjmR6AaHgTrbQVKrYLDedY1Zewtu0sIXXY794BbgHgAdW0Dtkqr ekpkdvJSMfHhwbSlxFLz9KadwoJjhRF3TpYCyl8Z4TXE92cJEasdph9kD2alIOvY8IMH FBSjgz+7p1IRymEsoGCAriPle3Z5/TTAoNNkhaNMVegrQNvvrpFNxoy6nBbUyKu35X6L cYVYCyNPBViHLckNz6X8tjaCve+nJQQk+FrkZq6jbbvgo+RuBIZi8l/m9oAW3LC2fJ9b Dbbcd2TNtUNDZw98fTD3Wd2SL9wm5CMDSiPiIBz+rQ2ZCM+HCaJHUqJe1iVQEjvLy2u0 oOlw== X-Gm-Message-State: AFuF++kIPXYzRmPeXF6/PAsTtMEg2RbfSqxKKK1an81zcyyTCbD1r49O 37ZnQWINHzbQW2JFL8Enp/XFCY/fAIKAeQj1bbjZ6lb1ETvrw7RW5mTSEAbbZLPuTmwB7ysVxDx AYDx3a6KAJ9ZQXV6IRA9hE3WR85MnkPpryQdSc+aRuua2BYbsvRMfOeLND4I650372A== X-Gm-Gg: AR+sD117vvbMUfYB/uLrPVC/D35o69EKSCHMYnm/BnD867kLOAnj4DFBRwlMWMEAP1l tJHsGxvyfspkGSrzZ25Ht+2EGKgny0ecrLCRzE8ZMcDv2U4mmhFPvaxAd9RtcK0ATTOQ8yp3YdH 9ptIFtIGi0kM2sQkOFveWD3FZNdmXjYjz0C7lCiMSRh02uGhha/Gi9e4vS4Zflf8JOF18AmtbKa F2jOgaT3PDwcLEVva6+jjGuM9egNtkds0TSRv3U1vNxnErlUWUXg51WFksWcuKIrSsZEZ3U9leh QbLGFShCHxCA+0xxPSyy0ZR/bMRahM3RmNU9nw9aisLR5uLhbK8oG6J6iDl6B3uCGhijQ2hlVFP dkUVdu1Xd2oeAyMxKEZ2LNwVOWy0fQi7xLNrMXN0vsf62VwN228QgxcmFeEdoJllmj8EHD6h1QC qqUwakv0dMg+riRbLiTHLUnn10kDM5RVE= X-Received: by 2002:a17:90b:3c51:b0:396:63a8:699b with SMTP id 98e67ed59e1d1-396d0e22ba9mr5689398a91.1.1787916554368; Fri, 28 Aug 2026 04:29:14 -0700 (PDT) X-Received: by 2002:a17:90b:3c51:b0:396:63a8:699b with SMTP id 98e67ed59e1d1-396d0e22ba9mr5689329a91.1.1787916553793; Fri, 28 Aug 2026 04:29:13 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Daniel Henrique Barboza , Palmer Dabbelt , Alistair Francis , Weiwei Li , Liu Zhiwei , Chao Liu Subject: [PATCH v10 05/10] riscv: add RPMI system reset service Date: Fri, 28 Aug 2026 16:57:57 +0530 Message-ID: <20260828112803.86636-6-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: aKF7Wi5BrsoGF21z6fQW-gvQ9bFPX38l X-Authority-Analysis: v=2.4 cv=ToDWQjXh c=1 sm=1 tr=0 ts=6a91710b cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=1ciSe8lxFlYQ8NbV_SwA:9 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-GUID: aKF7Wi5BrsoGF21z6fQW-gvQ9bFPX38l X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX4ETIg3VFpEay uUulboTaVZFzcJwhHQr/4l5EuSivI9b8CgvdpLzp97wAcMPKS5Wfk9SkK1RsFL2eMp6LcIeJMQ6 7ryuDO3GVUiMg/IEXXxf4vsqAMtcUZ0= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfXzOjJd1xIuG17 yLp+APAlXqdcsD149q0L5ylYhlFW47rwt8IHX2vqvBFlCJ+E94jVyV3L3Wo8gcy/2kQhxPS/lLm Hgsp0t+aiJmDuqQdX2ag3PliVFcdRuem63ZgbxthVBOGQkAehx06TrneTaI53/UQiRdt8u372Sy dclOaROXEbHwcffCj5IDHg2OUdzuR0VwLwg/P5L8j/SPq0g15KaHlfrvLMZ/y1E708dD7JoZTR2 FFGwQexVvWhogb7iqYh1fp6RPrvqMfpA45MomVKMtu+t9YLAZov41P+ziR42GOOci5sWM5+hTJj nJdLR1nP7IeF9gMqANDYExCUtm4n01vOIkP+30AVSRl67EaeWyc5oWZknmKLNhPJ20w+rw7XDjp H3BMwpWuNKk+k3Lzf9NCTwZWKkAieKwajqSBCsTR01aul9wnCkDPAn7A/zblr7sE3JNx6zbPlJI wUOmyGjhDiIyntzgcEQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 adultscore=0 impostorscore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 phishscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.168.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0a-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916594000154100 Content-Type: text/plain; charset="utf-8" Add a QEMU implementation of the RPMI System Reset service group. The service advertises shutdown and cold reboot reset types, validates guest requests, and dispatches accepted requests through the machine reset and shutdown callbacks. This lets firmware use RPMI reset commands while keeping the board-specific reset policy in the RISC-V virt machine. Signed-off-by: Subrahmanya Lingappa Reviewed-by: Daniel Henrique Barboza --- hw/misc/meson.build | 1 + hw/misc/riscv_rpmi.c | 68 ++++++++++- hw/misc/riscv_rpmi_internal.h | 9 ++ hw/misc/riscv_rpmi_sysreset.c | 206 ++++++++++++++++++++++++++++++++++ hw/riscv/rpmi-fdt-stub.c | 22 ++++ hw/riscv/rpmi-fdt.c | 2 +- hw/riscv/virt.c | 51 ++++++++- include/hw/misc/riscv_rpmi.h | 11 +- include/hw/riscv/rpmi-fdt.h | 11 ++ 9 files changed, 371 insertions(+), 10 deletions(-) create mode 100644 hw/misc/riscv_rpmi_sysreset.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 1b8220c6be..25916c93ed 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -178,4 +178,5 @@ system_ss.add(when: 'CONFIG_LASI', if_true: files('lasi= .c')) system_ss.add(when: 'CONFIG_AXIADO_CLK', if_true: files('axiado_clk.c')) system_ss.add(when: 'CONFIG_RISCV_RPMI', if_true: [files( 'riscv_rpmi.c', + 'riscv_rpmi_sysreset.c', ), librpmi], if_false: files('riscv_rpmi-stub.c')) diff --git a/hw/misc/riscv_rpmi.c b/hw/misc/riscv_rpmi.c index e24045c9bc..8f2b524138 100644 --- a/hw/misc/riscv_rpmi.c +++ b/hw/misc/riscv_rpmi.c @@ -184,10 +184,37 @@ static bool riscv_rpmi_transport_indices_valid(RiscvR= pmiState *s) s->a2p_req_size); } =20 +typedef struct RiscvRpmiServiceOps { + enum rpmi_servicegroup_id service_group; + bool (*add)(RiscvRpmiState *s, Error **errp); + void (*remove)(RiscvRpmiState *s); +} RiscvRpmiServiceOps; + +static const RiscvRpmiServiceOps riscv_rpmi_service_ops[] =3D { + { + .service_group =3D RPMI_SRVGRP_SYSTEM_RESET, + .add =3D riscv_rpmi_sysreset_add, + .remove =3D riscv_rpmi_sysreset_remove, + }, +}; + +static const RiscvRpmiServiceOps *riscv_rpmi_service_ops_by_group( + enum rpmi_servicegroup_id service_group) +{ + for (uint32_t i =3D 0; i < ARRAY_SIZE(riscv_rpmi_service_ops); i++) { + if (riscv_rpmi_service_ops[i].service_group =3D=3D service_group) { + return &riscv_rpmi_service_ops[i]; + } + } + + return NULL; +} + static void riscv_rpmi_configure_base(RiscvRpmiState *s, const RiscvRpmiConfig *cfg) { s->platform_info =3D g_strdup(cfg->platform_info); + s->machine_ops =3D cfg->machine_ops; s->services =3D cfg->services; s->service_count =3D cfg->service_count; =20 @@ -224,7 +251,9 @@ static void riscv_rpmi_reset_hold(Object *obj, ResetTyp= e type) =20 static void riscv_rpmi_cleanup(RiscvRpmiState *s) { - + for (uint32_t i =3D ARRAY_SIZE(riscv_rpmi_service_ops); i > 0; i--) { + riscv_rpmi_service_ops[i - 1].remove(s); + } =20 if (s->context) { rpmi_context_destroy(s->context); @@ -261,6 +290,30 @@ bool riscv_rpmi_service_enabled(RiscvRpmiState *s, return false; } =20 +bool riscv_rpmi_context_add_group(RiscvRpmiState *s, + struct rpmi_service_group *group, + const char *name, + Error **errp) +{ + enum rpmi_error rc; + + rc =3D rpmi_context_add_group(s->context, group); + if (rc !=3D RPMI_SUCCESS) { + error_setg(errp, "failed to add RPMI %s service group: %d", name, = rc); + return false; + } + + return true; +} + +void riscv_rpmi_context_remove_group(RiscvRpmiState *s, + struct rpmi_service_group *group) +{ + if (s->context && group) { + rpmi_context_remove_group(s->context, group); + } +} + static bool riscv_rpmi_validate_config(RiscvRpmiState *s, Error **errp) { uint64_t queue_bytes; @@ -332,9 +385,16 @@ static bool riscv_rpmi_add_service_group(RiscvRpmiStat= e *s, const RiscvRpmiServiceConfig *ser= vice, Error **errp) { - error_setg(errp, "unsupported RPMI service group %u", - service->service_group); - return false; + const RiscvRpmiServiceOps *ops; + + ops =3D riscv_rpmi_service_ops_by_group(service->service_group); + if (!ops) { + error_setg(errp, "unsupported RPMI service group %u", + service->service_group); + return false; + } + + return ops->add(s, errp); } =20 static bool riscv_rpmi_init_services(RiscvRpmiState *s, Error **errp) diff --git a/hw/misc/riscv_rpmi_internal.h b/hw/misc/riscv_rpmi_internal.h index c0cb1b64e6..1d7445b2d1 100644 --- a/hw/misc/riscv_rpmi_internal.h +++ b/hw/misc/riscv_rpmi_internal.h @@ -20,5 +20,14 @@ extern const struct rpmi_shmem_platform_ops rpmi_shmem_qemu_ops; bool riscv_rpmi_service_enabled(RiscvRpmiState *s, enum rpmi_servicegroup_id service_group); +bool riscv_rpmi_context_add_group(RiscvRpmiState *s, + struct rpmi_service_group *group, + const char *name, + Error **errp); +void riscv_rpmi_context_remove_group(RiscvRpmiState *s, + struct rpmi_service_group *group); + +bool riscv_rpmi_sysreset_add(RiscvRpmiState *s, Error **errp); +void riscv_rpmi_sysreset_remove(RiscvRpmiState *s); =20 #endif diff --git a/hw/misc/riscv_rpmi_sysreset.c b/hw/misc/riscv_rpmi_sysreset.c new file mode 100644 index 0000000000..775eb5483f --- /dev/null +++ b/hw/misc/riscv_rpmi_sysreset.c @@ -0,0 +1,206 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI System Reset service. + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#include "qemu/osdep.h" +#include "riscv_rpmi_internal.h" +#include "qemu/log.h" +#include "librpmi_env.h" + +typedef struct RiscvRpmiSysresetType { + uint32_t type; + void (*action)(RiscvRpmiState *s); +} RiscvRpmiSysresetType; + +typedef struct RiscvRpmiSysresetGroup { + struct rpmi_service_group group; + struct rpmi_service services[RPMI_SYSRST_SRV_ID_MAX]; + RiscvRpmiState *rpmi; +} RiscvRpmiSysresetGroup; + +static void riscv_rpmi_sysreset_reboot(RiscvRpmiState *s) +{ + const RiscvRpmiMachineOps *ops =3D s->machine_ops; + + if (ops && ops->system_reset) { + ops->system_reset(); + } +} + +static void riscv_rpmi_sysreset_shutdown(RiscvRpmiState *s) +{ + const RiscvRpmiMachineOps *ops =3D s->machine_ops; + + if (ops && ops->system_shutdown) { + ops->system_shutdown(); + } +} + +static const RiscvRpmiSysresetType riscv_rpmi_sysreset_types[] =3D { + { + .type =3D RPMI_SYSRST_TYPE_SHUTDOWN, + .action =3D riscv_rpmi_sysreset_shutdown, + }, { + .type =3D RPMI_SYSRST_TYPE_COLD_REBOOT, + .action =3D riscv_rpmi_sysreset_reboot, + }, +}; + +static const RiscvRpmiSysresetType *riscv_rpmi_sysreset_type_by_id( + uint32_t reset_type) +{ + for (uint32_t index =3D 0; index < ARRAY_SIZE(riscv_rpmi_sysreset_type= s); + index++) { + if (riscv_rpmi_sysreset_types[index].type =3D=3D reset_type) { + return &riscv_rpmi_sysreset_types[index]; + } + } + + return NULL; +} + +static void riscv_rpmi_do_system_reset(RiscvRpmiState *s, + rpmi_uint32_t reset_type) +{ + const RiscvRpmiSysresetType *type; + + type =3D riscv_rpmi_sysreset_type_by_id(reset_type); + if (type) { + type->action(s); + return; + } + + qemu_log_mask(LOG_GUEST_ERROR, "%s: unsupported reset type %u\n", + __func__, reset_type); +} + +static enum rpmi_error riscv_rpmi_sysreset_get_attributes( + struct rpmi_service_group *group, struct rpmi_service *service, + struct rpmi_transport *trans, rpmi_uint16_t request_data_len, + const rpmi_uint8_t *request_data, rpmi_uint16_t *response_data_len, + rpmi_uint8_t *response_data) +{ + uint32_t reset_type =3D ldl_le_p(request_data); + uint32_t *resp =3D (uint32_t *)response_data; + + *response_data_len =3D 2 * sizeof(*resp); + stl_le_p(&resp[0], RPMI_SUCCESS); + stl_le_p(&resp[1], riscv_rpmi_sysreset_type_by_id(reset_type) ? + RPMI_SYSRST_ATTRS_FLAGS_RESETTYPE : 0); + + return RPMI_SUCCESS; +} + +static enum rpmi_error riscv_rpmi_sysreset_do_reset( + struct rpmi_service_group *group, struct rpmi_service *service, + struct rpmi_transport *trans, rpmi_uint16_t request_data_len, + const rpmi_uint8_t *request_data, rpmi_uint16_t *response_data_len, + rpmi_uint8_t *response_data) +{ + RiscvRpmiSysresetGroup *sysreset =3D group->priv; + uint32_t reset_type =3D ldl_le_p(request_data); + uint32_t *resp =3D (uint32_t *)response_data; + + *response_data_len =3D sizeof(*resp); + + if (!riscv_rpmi_sysreset_type_by_id(reset_type)) { + stl_le_p(resp, (uint32_t)RPMI_ERR_INVALID_PARAM); + return RPMI_SUCCESS; + } + + stl_le_p(resp, RPMI_SUCCESS); + riscv_rpmi_do_system_reset(sysreset->rpmi, reset_type); + return RPMI_SUCCESS; +} + +static const struct rpmi_service riscv_rpmi_sysreset_services[] =3D { + [RPMI_SYSRST_SRV_ENABLE_NOTIFICATION] =3D { + .service_id =3D RPMI_SYSRST_SRV_ENABLE_NOTIFICATION, + .min_a2p_request_datalen =3D 8, + }, + [RPMI_SYSRST_SRV_GET_ATTRIBUTES] =3D { + .service_id =3D RPMI_SYSRST_SRV_GET_ATTRIBUTES, + .min_a2p_request_datalen =3D 4, + .process_a2p_request =3D riscv_rpmi_sysreset_get_attributes, + }, + [RPMI_SYSRST_SRV_SYSTEM_RESET] =3D { + .service_id =3D RPMI_SYSRST_SRV_SYSTEM_RESET, + .min_a2p_request_datalen =3D 4, + .process_a2p_request =3D riscv_rpmi_sysreset_do_reset, + }, +}; + +static struct rpmi_service_group *riscv_rpmi_sysreset_create(RiscvRpmiStat= e *s) +{ + RiscvRpmiSysresetGroup *sysreset; + struct rpmi_service_group *group; + + sysreset =3D g_new0(RiscvRpmiSysresetGroup, 1); + sysreset->rpmi =3D s; + memcpy(sysreset->services, riscv_rpmi_sysreset_services, + sizeof(riscv_rpmi_sysreset_services)); + + group =3D &sysreset->group; + group->name =3D "sysreset"; + group->servicegroup_id =3D RPMI_SRVGRP_SYSTEM_RESET; + group->max_service_id =3D RPMI_SYSRST_SRV_ID_MAX; + group->servicegroup_version =3D + RPMI_BASE_VERSION(RPMI_SPEC_VERSION_MAJOR, RPMI_SPEC_VERSION_MINOR= ); + group->privilege_level_bitmap =3D RPMI_PRIVILEGE_M_MODE_MASK; + group->services =3D sysreset->services; + group->lock =3D rpmi_env_alloc_lock(); + group->priv =3D sysreset; + + return group; +} + +static void riscv_rpmi_sysreset_destroy(struct rpmi_service_group *group) +{ + if (!group) { + return; + } + + rpmi_env_free_lock(group->lock); + g_free(group->priv); +} + +bool riscv_rpmi_sysreset_add(RiscvRpmiState *s, Error **errp) +{ + struct rpmi_service_group *group; + + if (s->sysreset_group) { + error_setg(errp, "duplicate RPMI sysreset service descriptor"); + return false; + } + + group =3D riscv_rpmi_sysreset_create(s); + if (!group) { + error_setg(errp, "failed to create RPMI sysreset service group"); + return false; + } + + if (!riscv_rpmi_context_add_group(s, group, "sysreset", errp)) { + riscv_rpmi_sysreset_destroy(group); + return false; + } + + s->sysreset_group =3D group; + return true; +} + +void riscv_rpmi_sysreset_remove(RiscvRpmiState *s) +{ + if (!s->sysreset_group) { + return; + } + + riscv_rpmi_context_remove_group(s, s->sysreset_group); + riscv_rpmi_sysreset_destroy(s->sysreset_group); + s->sysreset_group =3D NULL; +} diff --git a/hw/riscv/rpmi-fdt-stub.c b/hw/riscv/rpmi-fdt-stub.c index 9866236ab3..439a053c62 100644 --- a/hw/riscv/rpmi-fdt-stub.c +++ b/hw/riscv/rpmi-fdt-stub.c @@ -14,3 +14,25 @@ void riscv_rpmi_fdt_add_mbox(void *fdt G_GNUC_UNUSED, { g_assert_not_reached(); } + +void riscv_rpmi_fdt_add_service(void *fdt G_GNUC_UNUSED, + hwaddr shmem_base G_GNUC_UNUSED, + const char *node_name G_GNUC_UNUSED, + const char *compatible G_GNUC_UNUSED, + uint32_t mbox_handle G_GNUC_UNUSED, + enum rpmi_servicegroup_id service_group + G_GNUC_UNUSED, + bool has_mpxy_channel G_GNUC_UNUSED, + uint32_t mpxy_channel G_GNUC_UNUSED) +{ + g_assert_not_reached(); +} + +void riscv_rpmi_fdt_add_service_node(void *fdt G_GNUC_UNUSED, + hwaddr shmem_base G_GNUC_UNUSED, + const RiscvRpmiServiceConfig *service + G_GNUC_UNUSED, + uint32_t mbox_handle G_GNUC_UNUSED) +{ + g_assert_not_reached(); +} diff --git a/hw/riscv/rpmi-fdt.c b/hw/riscv/rpmi-fdt.c index 439c91c894..506be5d43b 100644 --- a/hw/riscv/rpmi-fdt.c +++ b/hw/riscv/rpmi-fdt.c @@ -75,7 +75,7 @@ void riscv_rpmi_fdt_add_service(void *fdt, hwaddr shmem_b= ase, const char *node_name, const char *compatible, uint32_t mbox_handle, - uint32_t service_group, + enum rpmi_servicegroup_id service_group, bool has_mpxy_channel, uint32_t mpxy_channel) { diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index c822cc15ca..7a97dfcf89 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -770,7 +770,8 @@ static void create_fdt_pcie(RISCVVirtState *s, create_pcie_irq_map(s, ms->fdt, name, irq_pcie_phandle); } =20 -static void create_fdt_reset(RISCVVirtState *s, uint32_t *phandle) +static void create_fdt_reset(RISCVVirtState *s, uint32_t *phandle, + bool use_syscon_reset) { char *name; uint32_t test_phandle; @@ -794,6 +795,14 @@ static void create_fdt_reset(RISCVVirtState *s, uint32= _t *phandle) test_phandle =3D qemu_fdt_get_phandle(ms->fdt, name); g_free(name); =20 + /* + * When RPMI is enabled, advertise reset and shutdown through RPMI so + * firmware routes these operations through the RPMI system reset serv= ice. + */ + if (!use_syscon_reset) { + return; + } + name =3D g_strdup_printf("/reboot"); qemu_fdt_add_subnode(ms->fdt, name); qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon-reboot"); @@ -993,6 +1002,34 @@ static void create_fdt_iommu(RISCVVirtState *s, uint1= 6_t bdf) } =20 =20 +static const RiscvRpmiServiceConfig virt_rpmi_services[] =3D { + { + .node_name =3D "sysreset", + .compatible =3D "riscv,rpmi-system-reset", + .service_group =3D RPMI_SRVGRP_SYSTEM_RESET, + }, +}; + +static uint32_t virt_rpmi_service_count(RISCVVirtState *s) +{ + return ARRAY_SIZE(virt_rpmi_services); +} + +static void virt_rpmi_system_reset(void) +{ + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); +} + +static void virt_rpmi_system_shutdown(void) +{ + qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); +} + +static const RiscvRpmiMachineOps virt_rpmi_machine_ops =3D { + .system_reset =3D virt_rpmi_system_reset, + .system_shutdown =3D virt_rpmi_system_shutdown, +}; + static RiscvRpmiConfig virt_rpmi_config(RISCVVirtState *s, const uint32_t *hart_ids, uint32_t hart_count) @@ -1004,8 +1041,11 @@ static RiscvRpmiConfig virt_rpmi_config(RISCVVirtSta= te *s, .a2p_req_size =3D VIRT_RPMI_A2P_REQ_SIZE, .p2a_req_size =3D VIRT_RPMI_P2A_REQ_SIZE, .platform_info =3D "QEMU RISC-V virt RPMI", + .machine_ops =3D &virt_rpmi_machine_ops, .hart_ids =3D hart_ids, .hart_count =3D hart_count, + .services =3D virt_rpmi_services, + .service_count =3D virt_rpmi_service_count(s), }; } =20 @@ -1014,6 +1054,7 @@ static void create_fdt_rpmi(RISCVVirtState *s, uint32= _t *phandle, { RiscvRpmiConfig rpmi_cfg =3D virt_rpmi_config(s, NULL, 0); uint32_t rpmi_mbox_handle; + uint32_t i; RiscvRpmiFdtMboxConfig cfg =3D { .shmem_base =3D rpmi_cfg.shmem_base, .doorbell_base =3D rpmi_cfg.doorbell_base, @@ -1024,6 +1065,12 @@ static void create_fdt_rpmi(RISCVVirtState *s, uint3= 2_t *phandle, =20 riscv_rpmi_fdt_add_mbox(MACHINE(s)->fdt, &cfg, phandle, &rpmi_mbox_handle); + + for (i =3D 0; i < rpmi_cfg.service_count; i++) { + riscv_rpmi_fdt_add_service_node(MACHINE(s)->fdt, rpmi_cfg.shmem_ba= se, + &rpmi_cfg.services[i], + rpmi_mbox_handle); + } } =20 static void finalize_fdt(RISCVVirtState *s) @@ -1049,7 +1096,7 @@ static void finalize_fdt(RISCVVirtState *s) create_fdt_rpmi(s, &phandle, msi_pcie_phandle); } =20 - create_fdt_reset(s, &phandle); + create_fdt_reset(s, &phandle, !s->have_rpmi); =20 create_fdt_uarts(s, irq_mmio_phandle); =20 diff --git a/include/hw/misc/riscv_rpmi.h b/include/hw/misc/riscv_rpmi.h index 93d128f2e2..1500ff1b8b 100644 --- a/include/hw/misc/riscv_rpmi.h +++ b/include/hw/misc/riscv_rpmi.h @@ -37,7 +37,6 @@ enum rpmi_servicegroup_id { #define VIRT_RPMI_A2P_REQ_SIZE (16 * RPMI_QUEUE_SLOT_SIZE) #define VIRT_RPMI_P2A_REQ_SIZE 0 =20 - #define TYPE_RISCV_RPMI "riscv-rpmi" OBJECT_DECLARE_SIMPLE_TYPE(RiscvRpmiState, RISCV_RPMI) =20 @@ -46,6 +45,11 @@ struct rpmi_service_group; struct rpmi_shmem; struct rpmi_transport; =20 +typedef struct RiscvRpmiMachineOps { + void (*system_reset)(void); + void (*system_shutdown)(void); +} RiscvRpmiMachineOps; + typedef struct RiscvRpmiServiceConfig { const char *node_name; const char *compatible; @@ -61,7 +65,7 @@ typedef struct RiscvRpmiConfig { uint32_t a2p_req_size; uint32_t p2a_req_size; const char *platform_info; - + const RiscvRpmiMachineOps *machine_ops; const uint32_t *hart_ids; uint32_t hart_count; const RiscvRpmiServiceConfig *services; @@ -78,7 +82,8 @@ struct RiscvRpmiState { uint32_t a2p_req_size; uint32_t p2a_req_size; char *platform_info; - + const RiscvRpmiMachineOps *machine_ops; + struct rpmi_service_group *sysreset_group; uint32_t *hart_ids; uint32_t hart_count; const RiscvRpmiServiceConfig *services; diff --git a/include/hw/riscv/rpmi-fdt.h b/include/hw/riscv/rpmi-fdt.h index b157bda1d1..d96c9c37e4 100644 --- a/include/hw/riscv/rpmi-fdt.h +++ b/include/hw/riscv/rpmi-fdt.h @@ -26,5 +26,16 @@ void riscv_rpmi_fdt_add_mbox(void *fdt, const RiscvRpmiFdtMboxConfig *cfg, uint32_t *phandle, uint32_t *mbox_handle); +void riscv_rpmi_fdt_add_service(void *fdt, hwaddr shmem_base, + const char *node_name, + const char *compatible, + uint32_t mbox_handle, + enum rpmi_servicegroup_id service_group, + bool has_mpxy_channel, + uint32_t mpxy_channel); + +void riscv_rpmi_fdt_add_service_node(void *fdt, hwaddr shmem_base, + const RiscvRpmiServiceConfig *service, + uint32_t mbox_handle); =20 #endif --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916613; cv=none; d=zohomail.com; s=zohoarc; b=mdT4PrTdSPId3cW7k4ExIS9KJQiclRptVP5zaFXlGvOSNSPI/EScI11ZQ3k0vq4RrG9I5cJ9pPiO4fKRHQvJLMUlg7g0HHpb9sU7NocmVGVWtvtrucWV+JOluprG8ZnjOjUIorP1CJyVCp1dKx1KERoUFqje80FADWfS5EhoZ+M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916613; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4Nb5E7CCFnnZkPSxaijw5EbGep/SSJCizp89xj20cXs=; b=ZBL7kjhYb9DHahIlC0Y/iupV1Nq9QOkdNIotpJhhxcOB/QY3XR6we212qKdP4hfbpmD5nv/tdo7cKvPLFVRIw/nywhcH/T9TX+IQ+rz5zrSaJMgQsCvEIyiZ8cRs1fhzQXVZGphyTDxvthkfNsSdSirHYU0nDolWMnFtkuVhkKc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916613062674.4314672714183; Fri, 28 Aug 2026 04:30:13 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzum1-00021P-VM; Fri, 28 Aug 2026 07:29:29 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzum0-00020y-CQ for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:28 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzuly-0007nq-3J for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:28 -0400 Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA7cCN2744819 for ; Fri, 28 Aug 2026 11:29:25 GMT Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb3mxsh6q-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:25 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-38dc0eee75dso290594a91.0 for ; Fri, 28 Aug 2026 04:29:24 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=4Nb5E7CCFnn ZkPSxaijw5EbGep/SSJCizp89xj20cXs=; b=NC5nBESnaaY9lmQMjqvPwM0u2v4 s17FxOJT6GLogNHFYf9xel1lLrwvJ31j2l4PvKnPe7b6dSt+NLMbo+kxKn1MTrPp 1jkmOdzAJPgrC8ZA/InUOa0BdJPuclqy2Fdi28pdzSTUsejp1doHbpoBj63YZz+t MrSj3m8NQ0Cs8yfRl8MmaJNLnC1PbyyBlqOKalsvqIXZ6tjK9joAu/GLkArR5HMS tmXoUmGW9cQRgZkH96KXhky/zkP++2YG94HEJUi4FYOuqbizn4N1zSQxqEoT8Uol jJ1//fJGNQIp+j7iGmYtpSS4Joqeqmq4fS93+FVji3/PS/rxiuWhCG309ig== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916564; x=1788521364; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=4Nb5E7CCFnnZkPSxaijw5EbGep/SSJCizp89xj20cXs=; b=jHmqToRaeZ/Y3gPsYcNn0aSDwJOPWsgNOneIIEhagTp8RoABRZ8Qckjqck1lp2As59 lSZLiPYpeQE8WCqz7/JJbRGe8i30v0aRoND5RMH29lvQxAKax22388xfsbuwuL5yhFpK G4JSYcDLcBYFSd38OUHnHL9c0JvxpikCmFdPWblupix3GJzyPfDV3nTTt2LCW+zVyqmG 4HwU51dtLXmPCWrhmM7swQjQeBfiMkY/OQ6buXpy6sxYzQkxxLlhFvns9xYA8CoD99rn 6PlMNxYORQnOjSQXnd/2eMtPRd5dHwT2JaYOrIAiYM1WbEuqIIK6w680G67hr6dtK23e wYlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916564; x=1788521364; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=4Nb5E7CCFnnZkPSxaijw5EbGep/SSJCizp89xj20cXs=; b=VXJVCxaLe/mowOOPi4mY/DP7YA5teeC/pt4CV+HYfSs3/53M5+crx0P6j2kvMbmAzl QtoAnJo02+AjTtBxdZd0tBVVfXuwU0tUz23/JBV272E+kV63J+WLPbOCCWwyXWVAnjmt nJGMTNzIUm4Mcxbm1ZfQ4LFCSfCD122aaOZRD68p79Uc/mHPnyplKbqaolrzYO+st5NY yDAriJr1e06XS8OhSF8bBmgh0MARz7aMnHbfgCND4OCyN3blKrwm+m+sENDDyxA2AugS uQ63iyCIp6ai65EF+gdjMzNnDhq99+/ToclMXu8OA25gdl+oUX2sF9qvZi0sJx69yXkJ 9ViQ== X-Gm-Message-State: AFuF++nKzgkR+urG/zAzwqEiRiblSe9xt2OlI/Db+6HAFvbFWnGPk4c4 l+CZ+PEVzpYEQJXpCjShIEnQEEJLiCMZ+JTFKjAtwPl/iOsVC5TOcKU2TNW/sz4Fhx0Fg+rdYAQ fVOYQFPyfC6FaVvFShyuLQcmE/i7STKlb3dpfpSkZ1WRzEd5pa3cHF75LKbuvOie2xA== X-Gm-Gg: AR+sD11m38RVkQqrVo2Pa+X/svypJno1nm96q5zpjwCbXqmNRT7AeyU0oqU9X8CyKkK 9vDOucy8YE1PNA+4F3vk4JcrG1YMdkqw2rXMLbC34S3ojBbl1KlrhGzCxcNLyKMmiQZ1JcV+A8P Wi05/29i6mcQl+vRhNYIRqRD+WxTOOBK9Pc2HkLekMs3W78jbFCQaRtmL08Eg4aJICrkKMf40I4 D+pQQGD05cKnkO7sF2f99VIXvrKL+0pPfzuqvIwii8217b92c+j4Bcvzsk7nK1vVm9AXexnQpTA K/04m3qW+pIqBhvHYILHg1rK8u7L8S/zHyMeSivMNgj0J05GDZzovQu7es4p/KwGfWfigjyN+tP XPLn66Br8sXVpQDBb0aLtt5b7DkhHCWSKrGT44UJWJ+WHuEhEFhLjq1cLYAwqKU8WfgJHfIIirO A9zl/iYqSVLy8OK5eWQKpyFIDvsi386CI= X-Received: by 2002:a17:90b:4d88:b0:38e:480b:99a5 with SMTP id 98e67ed59e1d1-396d0f7d73bmr5690636a91.2.1787916561224; Fri, 28 Aug 2026 04:29:21 -0700 (PDT) X-Received: by 2002:a17:90b:4d88:b0:38e:480b:99a5 with SMTP id 98e67ed59e1d1-396d0f7d73bmr5690275a91.2.1787916557542; Fri, 28 Aug 2026 04:29:17 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Daniel Henrique Barboza , Palmer Dabbelt , Alistair Francis , Weiwei Li , Liu Zhiwei , Chao Liu Subject: [PATCH v10 06/10] riscv: add RPMI HSM service Date: Fri, 28 Aug 2026 16:57:58 +0530 Message-ID: <20260828112803.86636-7-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfXyPJ4GjBERERz 83UCK1JO2kdFOhM6SdJVtM7Lh+3mCiwKJICAFscYTNW8eeFzNjlhv4ATKF7NUv5jqkF0F2saoP1 qiofo1kyhts6uV7elEWJxQyZQe4lqyfGw+J4Sskf0XhAFgWOw3GDbVMRomio9OKYSor9NWFHdcc xnwKXa+crYCms3rflM66CjObB4sKmiOCWiKLHVVX7+CXPu9Dcn3Hv21T+pAQZgr/jPNp8w97IWV Jl4SgBKPOdL73/57hlLZiFNM75v2LpcTpcdY+FTLZqzmJL5peODHNbcXAsrPPtgWbkmdb9uWgJR BeMQCkdnBkXZUSLfMrhgOOLx7LFjtLrgPtLebLjYDDiiX8U9SD6qfYeiy1wO3yNKUb0xHsMb06F MHM2TSF0HRO9MO88Lr8FAbhJfZ/L1z4zADwNnP9pkaTt+yXzqOEX6isl924ubni2nwttIuaTnAv dQ43e2nS948tlNwnBKw== X-Authority-Analysis: v=2.4 cv=MONQXsZl c=1 sm=1 tr=0 ts=6a917115 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=itn9ZVZVmevHaGIKV1oA:9 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX8N87GhHszJdc blbMTCQ2ZJK46uPCuDzAEDxiSKVRcjzs9tjKS5WNlRJZ5Ict9381pVLfI84ZlhCGs23vlpSiSfj VJf2zaUcBcl5UarsTszpdsGgZOr/d2E= X-Proofpoint-ORIG-GUID: s4CG2_6bOFuPaNLDMa0R9SyIK-1XW9-n X-Proofpoint-GUID: s4CG2_6bOFuPaNLDMa0R9SyIK-1XW9-n X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 lowpriorityscore=0 phishscore=0 suspectscore=0 bulkscore=0 impostorscore=0 spamscore=0 priorityscore=1501 clxscore=1015 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916615244158500 Content-Type: text/plain; charset="utf-8" Add the RPMI Hart State Management service group for RISC-V virt. The service exposes the configured virt hart IDs to librpmi and keeps per-hart RPMI hardware state in the RPMI device. Start, stop, and suspend requests update QEMU CPU halted state and resume/kick vCPUs as needed so firmware can exercise RPMI HSM operations against the emulated topology. Signed-off-by: Subrahmanya Lingappa Reviewed-by: Daniel Henrique Barboza --- hw/misc/meson.build | 1 + hw/misc/riscv_rpmi.c | 5 + hw/misc/riscv_rpmi_hsm.c | 281 ++++++++++++++++++++++++++++++++++ hw/misc/riscv_rpmi_internal.h | 4 + hw/riscv/virt.c | 5 + include/hw/misc/riscv_rpmi.h | 4 + 6 files changed, 300 insertions(+) create mode 100644 hw/misc/riscv_rpmi_hsm.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 25916c93ed..3f2caaf06f 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -179,4 +179,5 @@ system_ss.add(when: 'CONFIG_AXIADO_CLK', if_true: files= ('axiado_clk.c')) system_ss.add(when: 'CONFIG_RISCV_RPMI', if_true: [files( 'riscv_rpmi.c', 'riscv_rpmi_sysreset.c', + 'riscv_rpmi_hsm.c', ), librpmi], if_false: files('riscv_rpmi-stub.c')) diff --git a/hw/misc/riscv_rpmi.c b/hw/misc/riscv_rpmi.c index 8f2b524138..d93bb70fca 100644 --- a/hw/misc/riscv_rpmi.c +++ b/hw/misc/riscv_rpmi.c @@ -195,6 +195,10 @@ static const RiscvRpmiServiceOps riscv_rpmi_service_op= s[] =3D { .service_group =3D RPMI_SRVGRP_SYSTEM_RESET, .add =3D riscv_rpmi_sysreset_add, .remove =3D riscv_rpmi_sysreset_remove, + }, { + .service_group =3D RPMI_SRVGRP_HSM, + .add =3D riscv_rpmi_hsm_add, + .remove =3D riscv_rpmi_hsm_remove, }, }; =20 @@ -247,6 +251,7 @@ static void riscv_rpmi_reset_hold(Object *obj, ResetTyp= e type) memory_region_set_dirty(&s->shmem, 0, s->shmem_size); } =20 + riscv_rpmi_hsm_reset(s); } =20 static void riscv_rpmi_cleanup(RiscvRpmiState *s) diff --git a/hw/misc/riscv_rpmi_hsm.c b/hw/misc/riscv_rpmi_hsm.c new file mode 100644 index 0000000000..08a985cb30 --- /dev/null +++ b/hw/misc/riscv_rpmi_hsm.c @@ -0,0 +1,281 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI HSM service. + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#include "qemu/osdep.h" +#include "riscv_rpmi_internal.h" +#include "hw/core/cpu.h" +#include "librpmi_env.h" + +static const struct rpmi_hsm_suspend_type riscv_rpmi_hsm_suspend_types[] = =3D { + { + .type =3D 0, + .info =3D { + .flags =3D 0, + .entry_latency_us =3D 0, + .exit_latency_us =3D 0, + .wakeup_latency_us =3D 0, + .min_residency_us =3D 0, + }, + }, +}; + +typedef struct RiscvRpmiHsmStateTransition { + enum rpmi_hart_hw_state state; + bool halted; + bool resume; +} RiscvRpmiHsmStateTransition; + +static const RiscvRpmiHsmStateTransition riscv_rpmi_hsm_state_transitions[= ] =3D { + { + .state =3D RPMI_HART_HW_STATE_STARTED, + .halted =3D false, + .resume =3D true, + }, { + .state =3D RPMI_HART_HW_STATE_STOPPED, + .halted =3D true, + .resume =3D false, + }, { + .state =3D RPMI_HART_HW_STATE_SUSPENDED, + .halted =3D true, + .resume =3D false, + }, +}; + +static const RiscvRpmiHsmStateTransition *riscv_rpmi_hsm_state_transition( + enum rpmi_hart_hw_state state) +{ + for (uint32_t index =3D 0; + index < ARRAY_SIZE(riscv_rpmi_hsm_state_transitions); index++) { + if (riscv_rpmi_hsm_state_transitions[index].state =3D=3D state) { + return &riscv_rpmi_hsm_state_transitions[index]; + } + } + + return NULL; +} + +static CPUState *riscv_rpmi_hart_cpu(RiscvRpmiState *s, uint32_t hart_inde= x) +{ + if (hart_index >=3D s->hart_count || !s->hart_ids) { + return NULL; + } + + return cpu_by_arch_id(s->hart_ids[hart_index]); +} + +static void riscv_rpmi_hsm_set_hw_state(RiscvRpmiState *s, + uint32_t hart_index, + enum rpmi_hart_hw_state state) +{ + CPUState *cpu =3D riscv_rpmi_hart_cpu(s, hart_index); + const RiscvRpmiHsmStateTransition *transition; + + if (hart_index >=3D s->hart_count || !s->hsm_hw_states) { + return; + } + + s->hsm_hw_states[hart_index] =3D state; + if (!cpu) { + return; + } + + transition =3D riscv_rpmi_hsm_state_transition(state); + if (!transition) { + return; + } + + cpu->halted =3D transition->halted; + if (transition->resume) { + cpu_resume(cpu); + } else { + qemu_cpu_kick(cpu); + } +} + +static enum rpmi_error riscv_rpmi_hsm_start_prepare( + void *priv, rpmi_uint32_t hart_index, rpmi_uint64_t start_addr) +{ + RiscvRpmiState *s =3D priv; + CPUState *cpu =3D riscv_rpmi_hart_cpu(s, hart_index); + + if (!cpu) { + return RPMI_ERR_INVALID_PARAM; + } + + cpu_set_pc(cpu, start_addr); + riscv_rpmi_hsm_set_hw_state(s, hart_index, RPMI_HART_HW_STATE_STARTED); + return RPMI_SUCCESS; +} + +static void riscv_rpmi_hsm_start_finalize(void *priv, + rpmi_uint32_t hart_index, + rpmi_uint64_t start_addr) +{ +} + +static enum rpmi_error riscv_rpmi_hsm_stop_prepare(void *priv, + rpmi_uint32_t hart_inde= x) +{ + RiscvRpmiState *s =3D priv; + + if (!riscv_rpmi_hart_cpu(s, hart_index)) { + return RPMI_ERR_INVALID_PARAM; + } + + riscv_rpmi_hsm_set_hw_state(s, hart_index, RPMI_HART_HW_STATE_STOPPED); + return RPMI_SUCCESS; +} + +static void riscv_rpmi_hsm_stop_finalize(void *priv, rpmi_uint32_t hart_in= dex) +{ +} + +static enum rpmi_error riscv_rpmi_hsm_suspend_prepare( + void *priv, rpmi_uint32_t hart_index, + const struct rpmi_hsm_suspend_type *suspend_type, + rpmi_uint64_t resume_addr) +{ + RiscvRpmiState *s =3D priv; + + if (!suspend_type || !riscv_rpmi_hart_cpu(s, hart_index)) { + return RPMI_ERR_INVALID_PARAM; + } + + riscv_rpmi_hsm_set_hw_state(s, hart_index, RPMI_HART_HW_STATE_SUSPENDE= D); + return RPMI_SUCCESS; +} + +static void riscv_rpmi_hsm_suspend_finalize( + void *priv, rpmi_uint32_t hart_index, + const struct rpmi_hsm_suspend_type *suspend_type, + rpmi_uint64_t resume_addr) +{ +} + +static enum rpmi_hart_hw_state riscv_rpmi_hsm_get_hw_state( + void *priv, rpmi_uint32_t hart_index) +{ + RiscvRpmiState *s =3D priv; + + if (hart_index >=3D s->hart_count || !s->hsm_hw_states) { + return RPMI_HART_HW_STATE_STOPPED; + } + + return s->hsm_hw_states[hart_index]; +} + +static const struct rpmi_hsm_platform_ops riscv_rpmi_hsm_ops =3D { + .hart_get_hw_state =3D riscv_rpmi_hsm_get_hw_state, + .hart_start_prepare =3D riscv_rpmi_hsm_start_prepare, + .hart_start_finalize =3D riscv_rpmi_hsm_start_finalize, + .hart_stop_prepare =3D riscv_rpmi_hsm_stop_prepare, + .hart_stop_finalize =3D riscv_rpmi_hsm_stop_finalize, + .hart_suspend_prepare =3D riscv_rpmi_hsm_suspend_prepare, + .hart_suspend_finalize =3D riscv_rpmi_hsm_suspend_finalize, +}; + +static bool riscv_rpmi_hsm_create(RiscvRpmiState *s, + struct rpmi_service_group **group, + Error **errp) +{ + struct rpmi_hsm *hsm; + + if (!s->hart_count || !s->hart_ids) { + error_setg(errp, "RPMI HSM service requires hart IDs"); + return false; + } + + s->hsm_hw_states =3D g_new0(uint32_t, s->hart_count); + for (uint32_t i =3D 0; i < s->hart_count; i++) { + s->hsm_hw_states[i] =3D RPMI_HART_HW_STATE_STARTED; + } + + hsm =3D rpmi_hsm_create(s->hart_count, s->hart_ids, + ARRAY_SIZE(riscv_rpmi_hsm_suspend_types), + riscv_rpmi_hsm_suspend_types, + &riscv_rpmi_hsm_ops, s); + if (!hsm) { + g_clear_pointer(&s->hsm_hw_states, g_free); + error_setg(errp, "failed to create RPMI HSM context"); + return false; + } + + *group =3D rpmi_service_group_hsm_create(hsm); + if (!*group) { + rpmi_hsm_destroy(hsm); + g_clear_pointer(&s->hsm_hw_states, g_free); + error_setg(errp, "failed to create RPMI HSM service group"); + return false; + } + + s->hsm =3D hsm; + return true; +} + +static void riscv_rpmi_hsm_destroy(RiscvRpmiState *s) +{ + if (s->hsm_group) { + rpmi_env_free_lock(s->hsm_group->lock); + s->hsm_group->lock =3D NULL; + rpmi_service_group_hsm_destroy(s->hsm_group); + s->hsm_group =3D NULL; + } + + if (s->hsm) { + rpmi_hsm_destroy(s->hsm); + s->hsm =3D NULL; + } + + g_clear_pointer(&s->hsm_hw_states, g_free); +} + + +bool riscv_rpmi_hsm_add(RiscvRpmiState *s, Error **errp) +{ + struct rpmi_service_group *group; + + if (s->hsm_group) { + error_setg(errp, "duplicate RPMI HSM service descriptor"); + return false; + } + + if (!riscv_rpmi_hsm_create(s, &group, errp)) { + return false; + } + + if (!riscv_rpmi_context_add_group(s, group, "HSM", errp)) { + s->hsm_group =3D group; + riscv_rpmi_hsm_destroy(s); + return false; + } + + s->hsm_group =3D group; + return true; +} + +void riscv_rpmi_hsm_remove(RiscvRpmiState *s) +{ + riscv_rpmi_context_remove_group(s, s->hsm_group); + riscv_rpmi_hsm_destroy(s); +} + +void riscv_rpmi_hsm_reset(RiscvRpmiState *s) +{ + if (!s->hsm_hw_states) { + return; + } + + for (uint32_t i =3D 0; i < s->hart_count; i++) { + s->hsm_hw_states[i] =3D RPMI_HART_HW_STATE_STARTED; + } + if (s->hsm) { + rpmi_hsm_process_state_changes(s->hsm); + } +} diff --git a/hw/misc/riscv_rpmi_internal.h b/hw/misc/riscv_rpmi_internal.h index 1d7445b2d1..7f9d110776 100644 --- a/hw/misc/riscv_rpmi_internal.h +++ b/hw/misc/riscv_rpmi_internal.h @@ -30,4 +30,8 @@ void riscv_rpmi_context_remove_group(RiscvRpmiState *s, bool riscv_rpmi_sysreset_add(RiscvRpmiState *s, Error **errp); void riscv_rpmi_sysreset_remove(RiscvRpmiState *s); =20 +bool riscv_rpmi_hsm_add(RiscvRpmiState *s, Error **errp); +void riscv_rpmi_hsm_remove(RiscvRpmiState *s); +void riscv_rpmi_hsm_reset(RiscvRpmiState *s); + #endif diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 7a97dfcf89..7c29e3634c 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -1008,6 +1008,11 @@ static const RiscvRpmiServiceConfig virt_rpmi_servic= es[] =3D { .compatible =3D "riscv,rpmi-system-reset", .service_group =3D RPMI_SRVGRP_SYSTEM_RESET, }, + { + .node_name =3D "hsm", + .compatible =3D "riscv,rpmi-hsm", + .service_group =3D RPMI_SRVGRP_HSM, + }, }; =20 static uint32_t virt_rpmi_service_count(RISCVVirtState *s) diff --git a/include/hw/misc/riscv_rpmi.h b/include/hw/misc/riscv_rpmi.h index 1500ff1b8b..9f7aa9f6ef 100644 --- a/include/hw/misc/riscv_rpmi.h +++ b/include/hw/misc/riscv_rpmi.h @@ -44,6 +44,7 @@ struct rpmi_context; struct rpmi_service_group; struct rpmi_shmem; struct rpmi_transport; +struct rpmi_hsm; =20 typedef struct RiscvRpmiMachineOps { void (*system_reset)(void); @@ -84,6 +85,9 @@ struct RiscvRpmiState { char *platform_info; const RiscvRpmiMachineOps *machine_ops; struct rpmi_service_group *sysreset_group; + struct rpmi_hsm *hsm; + struct rpmi_service_group *hsm_group; + uint32_t *hsm_hw_states; uint32_t *hart_ids; uint32_t hart_count; const RiscvRpmiServiceConfig *services; --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916640; cv=none; d=zohomail.com; s=zohoarc; b=XsMrNNAAAXCYfiQv0hA+pYjqr8DjdEjzOMhtg3aFxerWYDcwyatxE4X+n29ba+t+7FW4zzB+nKeZbgaJ18OrxfNghvtsex6NqSwM4rRhdmpEAw2F5cSdIfotIecV7prcz8TCx+HYkCesl59LiGpxa10RivzU7X6KXB8EHnFY/Js= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916640; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ETPx3X9+/qbti0IIfnwrbQHbBK46zAGcxv/t2I10wq0=; b=OlnnCL5t3VCWoIOJSRAKaakOlFv6prrIcuWdlN6+Cm/cPRHMIHF4WXmpCag5qDVjGnDSBQmqzNEvedhDA2a3CcFxtABiUgrVKx7P8P2awjEKQ9N8docbijpnOVeVQhH0qLXHIrKa+29ikr9uhOmCzQ1PnO2wnFAE9HxZH1Izr7U= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916640824930.7355930291767; Fri, 28 Aug 2026 04:30:40 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzum0-00020x-DX; Fri, 28 Aug 2026 07:29:28 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzuly-0001zX-DX for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:26 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulw-0007nJ-0B for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:26 -0400 Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA8KOS2798369 for ; Fri, 28 Aug 2026 11:29:23 GMT Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb62h0x16-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:22 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-38ff2cd7b76so255229a91.2 for ; Fri, 28 Aug 2026 04:29:22 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=ETPx3X9+/qb ti0IIfnwrbQHbBK46zAGcxv/t2I10wq0=; b=heHHYvzk70GwV54QrMsffY08tpB 771JzRdo5O7ZbwogFxGwlqjvNCaDDq2cUAcCBQKgUaCKuM12xy0Yg9eu45m4aVM3 ePSI0+nzXk75iqiaIkvD4n7zhwqxyQ4/JRJUzDCuk9g5ZjP5dHnohzc0QljwFG8Y pj87OG5MoHq51YoQ6LDhmCkDYMXghe0JQfdujq33VNZdWEIz2ZRvfuC3X4czv8lJ S3HYQ0OlF7F3MXF3bxDyD2Iag36hXCPjKJmGvhJoldAEjUToMipaFBY21qP3pwJs QQk70sVpm7QrEN0cfss1fYg8r7taqOvXGRM5u0AKeL3ztfkiRya2KQa/bLg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916562; x=1788521362; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ETPx3X9+/qbti0IIfnwrbQHbBK46zAGcxv/t2I10wq0=; b=kecrdyRrbU0mhNPMk6UlsI1xFMTaKM3fZH1gkhYYINzECJGTEXsRpVw/oZ944HrEUg 7K/N6jktqiWDAfTTBzibkHceBqPJ7rGlpxZWyplmZhvP6mZv7eOAfyl/olQChcI66JiS 8eUPCfHPfwHwwYvg/KDF6egw/Xtk9UaSCKHD2io4dUSDMahhtyup1+xdIA8t7dEiu1hV y2rbHXwTPcfygQNdCHNWeC4ozJmQ1hPDs3agVliSo68nOozYQzriTFbZESA+G5yWrXYe PG+yf/GV3+L2dYn1CwqVQTq1Pc2imOSVbGDeJ+w66zqFHBsOUP2UGqrbGoL9L6MA4cEc WkoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916562; x=1788521362; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ETPx3X9+/qbti0IIfnwrbQHbBK46zAGcxv/t2I10wq0=; b=h9sMMgDFs9+ncyHKGmiqLUj74BV7O8EdvgabelZPOjKbdiJGsSG7m6pyvGKhVv+g1o aKuwDacQG8HrdFDRfU0u9kbyJ44w5jUPXnYE34yAJKJ2T/Esmx6QiWCUMSu3aSjs8dW2 vOYF/Kuobm1xon7Ytk1JE53NgGdm18pxzqZh+OMgSTxQVI9WtRK6weqPFSOKL0Og9un6 0iZRQ/2WSySVPUEgUoLeZMFDtSRwO3WVrXbBzGPvijOYgVgo8vPx1oH8fXpcW8nOLzj0 VyBi14iWPS7QCW6w1QF3wIyRvg4Moiw9TymKnTGHzr/UKObgsgzSQmw6ANsqxvDe1wOp rZhw== X-Gm-Message-State: AFuF++lw/T7+Z1RRkl5pN63IpFimKF0ork0f8eA0jlt9Rs6/nId5vi2l 5rozSrJTSH+szg5/vuw2ghKnt8IhTdkIZK7oh7z6Mse1m3yuEqrIFy5lXDjq61xJ1FE0njcDK7q U1XioeThbabr0mAa9hszb4QqUFQVLlJhsiJzelJt2KW1OmndisAcTUuzk2RHzifmsNw== X-Gm-Gg: AR+sD112Os6NltlF/yUE8jULoYzZOz5LOzdxfsQ/pOfhtfXAgyO4O389/eXyzGKUkGm GwRWVbQXkSEyr78FyuUyW7PAKjaZjAra9pCnD/0aMszo+Th1Fm0RgmEe0PHJfMmhu/TF3ahJpoQ p+4eMOQ3EJxT/AbfUTj5Oqw1hCeIgHZId/NDlMGuAjhdidZDg2neZEieJYeexAXNKtnDd6PERsO WydRBSxIp8zjj0i0+QSERsKIHwzHO1RvvUXmYLzv+KoUhHIbfek55v1U0+Grw/RNH9sKP53lOIG N5/6tTGzgL7k/3qWOKX5v9Z1vuWgYMWB/tOgpZFYvKGNIgoBb/fhom8R5gDhIJtr60vBlpM5ttG iMhBjnYMor/0t80YYp0jpxHvKFU4NnFCYrPCXMtE4S7dlVZ8SWV9NiWYWhmdSmW3/v3IMD0P/F1 F6ijmi6ie0psy17TcTpExMuH1wz1ZRivM= X-Received: by 2002:a17:90b:4c84:b0:381:bcfb:e710 with SMTP id 98e67ed59e1d1-396d0fe0b90mr5818015a91.3.1787916561962; Fri, 28 Aug 2026 04:29:21 -0700 (PDT) X-Received: by 2002:a17:90b:4c84:b0:381:bcfb:e710 with SMTP id 98e67ed59e1d1-396d0fe0b90mr5817971a91.3.1787916561458; Fri, 28 Aug 2026 04:29:21 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Daniel Henrique Barboza , Palmer Dabbelt , Alistair Francis , Weiwei Li , Liu Zhiwei , Chao Liu Subject: [PATCH v10 07/10] riscv: add RPMI system suspend service Date: Fri, 28 Aug 2026 16:57:59 +0530 Message-ID: <20260828112803.86636-8-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX8nD8GNjvkGZW DWoO2wqwlaNIXt6h5y7BDORgv0bYO/kYZvmxS+gXO0DfnfaaD8KgAcpmxLrXLKgNwGfuuKgFmuG N0tILfj76BlOxKqZzqqZ5PktuaU5dTU= X-Proofpoint-GUID: PQbsRuqQX50ymojOuAaY1obVn-cR9zYB X-Proofpoint-ORIG-GUID: PQbsRuqQX50ymojOuAaY1obVn-cR9zYB X-Authority-Analysis: v=2.4 cv=I5dVgtgg c=1 sm=1 tr=0 ts=6a917113 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=U8RMtI3d1EX5IS3VA7UA:9 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX2/Lspr1oXFAb rlJZmwbC+0u5XSsy6/LPysMisQQD8eKc38eUTmZGf94kzYdJ5kUkwubhZ+FPQrW/DrUBMbkwukq fCcaraENKfIoG5186iGZYzrwbLHYMPQ4xR5rKIYpRVbsCf+7w4z2EmWNJB3QMYeAlau4PEN4a9J ciRKHUfjHTP902eYVdm5nP9qtXkjvKLPr/zMAzFw0PiWTdDXLmWHReMe7szKJspmJiAeXPqAjmJ EzVplfgoL1jozjqqcZAM9uFhn3sMP13JsRTWI/8aZQQHW40SFmsKqewQhA4OujyVvkYya9T9TY/ 01X6jt5HQozPl2fuhsskCEcoyx4OVUCd8inZVq/yqAD+izCDM38llcB8HS3gfRd8rmGU3pt4xr8 Gld7f8s1cRfmfPJImehbl6nrsTR0o3HO3WiEYdr7QQ1TNkgPDAG41dq8BAZ8FZk+2kYMFRhXIQh qWxKKgu7tMSySNiQJLw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 impostorscore=0 adultscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 clxscore=1015 malwarescore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916642667154101 Content-Type: text/plain; charset="utf-8" Add the RPMI System Suspend service group for RISC-V virt. The service advertises suspend-to-RAM support through librpmi, registers QEMU wakeup support, and routes the suspend finalize callback to the machine suspend path. On wakeup it processes RPMI group events and defers the HSM hart resume until vCPUs are ready to run again. Signed-off-by: Subrahmanya Lingappa Reviewed-by: Daniel Henrique Barboza --- hw/misc/meson.build | 1 + hw/misc/riscv_rpmi.c | 4 + hw/misc/riscv_rpmi_hsm.c | 10 +- hw/misc/riscv_rpmi_internal.h | 6 ++ hw/misc/riscv_rpmi_syssusp.c | 194 ++++++++++++++++++++++++++++++++++ hw/riscv/virt.c | 24 +++++ include/hw/misc/riscv_rpmi.h | 10 ++ 7 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 hw/misc/riscv_rpmi_syssusp.c diff --git a/hw/misc/meson.build b/hw/misc/meson.build index 3f2caaf06f..a0b15aaf2e 100644 --- a/hw/misc/meson.build +++ b/hw/misc/meson.build @@ -180,4 +180,5 @@ system_ss.add(when: 'CONFIG_RISCV_RPMI', if_true: [file= s( 'riscv_rpmi.c', 'riscv_rpmi_sysreset.c', 'riscv_rpmi_hsm.c', + 'riscv_rpmi_syssusp.c', ), librpmi], if_false: files('riscv_rpmi-stub.c')) diff --git a/hw/misc/riscv_rpmi.c b/hw/misc/riscv_rpmi.c index d93bb70fca..c9593ee073 100644 --- a/hw/misc/riscv_rpmi.c +++ b/hw/misc/riscv_rpmi.c @@ -199,6 +199,10 @@ static const RiscvRpmiServiceOps riscv_rpmi_service_op= s[] =3D { .service_group =3D RPMI_SRVGRP_HSM, .add =3D riscv_rpmi_hsm_add, .remove =3D riscv_rpmi_hsm_remove, + }, { + .service_group =3D RPMI_SRVGRP_SYSTEM_SUSPEND, + .add =3D riscv_rpmi_syssusp_add, + .remove =3D riscv_rpmi_syssusp_remove, }, }; =20 diff --git a/hw/misc/riscv_rpmi_hsm.c b/hw/misc/riscv_rpmi_hsm.c index 08a985cb30..928fe3e52e 100644 --- a/hw/misc/riscv_rpmi_hsm.c +++ b/hw/misc/riscv_rpmi_hsm.c @@ -236,7 +236,6 @@ static void riscv_rpmi_hsm_destroy(RiscvRpmiState *s) g_clear_pointer(&s->hsm_hw_states, g_free); } =20 - bool riscv_rpmi_hsm_add(RiscvRpmiState *s, Error **errp) { struct rpmi_service_group *group; @@ -279,3 +278,12 @@ void riscv_rpmi_hsm_reset(RiscvRpmiState *s) rpmi_hsm_process_state_changes(s->hsm); } } + +void riscv_rpmi_hsm_resume(RiscvRpmiState *s, uint32_t hart_index, + uint64_t resume_addr) +{ + riscv_rpmi_hsm_set_hw_state(s, hart_index, RPMI_HART_HW_STATE_STARTED); + if (s->hsm) { + rpmi_hsm_process_state_changes(s->hsm); + } +} diff --git a/hw/misc/riscv_rpmi_internal.h b/hw/misc/riscv_rpmi_internal.h index 7f9d110776..2c4723ad6b 100644 --- a/hw/misc/riscv_rpmi_internal.h +++ b/hw/misc/riscv_rpmi_internal.h @@ -33,5 +33,11 @@ void riscv_rpmi_sysreset_remove(RiscvRpmiState *s); bool riscv_rpmi_hsm_add(RiscvRpmiState *s, Error **errp); void riscv_rpmi_hsm_remove(RiscvRpmiState *s); void riscv_rpmi_hsm_reset(RiscvRpmiState *s); +void riscv_rpmi_hsm_resume(RiscvRpmiState *s, uint32_t hart_index, + uint64_t resume_addr); + +bool riscv_rpmi_syssusp_add(RiscvRpmiState *s, Error **errp); +void riscv_rpmi_syssusp_remove(RiscvRpmiState *s); + =20 #endif diff --git a/hw/misc/riscv_rpmi_syssusp.c b/hw/misc/riscv_rpmi_syssusp.c new file mode 100644 index 0000000000..f4a9bbdaf4 --- /dev/null +++ b/hw/misc/riscv_rpmi_syssusp.c @@ -0,0 +1,194 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * RISC-V RPMI System Suspend service. + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#include "qemu/osdep.h" +#include "riscv_rpmi_internal.h" +#include "qemu/timer.h" +#include "system/runstate.h" + +static const struct rpmi_system_suspend_type riscv_rpmi_syssusp_types[] = =3D { + { + .type =3D RPMI_SYSSUSP_TYPE_SUSPEND_TO_RAM, + .attr =3D RPMI_SYSSUSP_ATTRS_FLAGS_RESUMEADDR, + }, +}; + +static enum rpmi_error riscv_rpmi_syssusp_prepare( + void *priv, rpmi_uint32_t hart_index, + const struct rpmi_system_suspend_type *syssusp_type, + rpmi_uint64_t resume_addr) +{ + RiscvRpmiState *s =3D priv; + + if (s->machine_ops && s->machine_ops->register_wakeup_support) { + s->machine_ops->register_wakeup_support(); + } + return RPMI_SUCCESS; +} + +static rpmi_bool_t riscv_rpmi_syssusp_ready(void *priv, + rpmi_uint32_t hart_index) +{ + return true; +} + +static void riscv_rpmi_syssusp_finalize( + void *priv, rpmi_uint32_t hart_index, + const struct rpmi_system_suspend_type *syssusp_type, + rpmi_uint64_t resume_addr) +{ + RiscvRpmiState *s =3D priv; + + if (s->machine_ops && s->machine_ops->system_suspend) { + s->machine_ops->system_suspend(); + } +} + +static rpmi_bool_t riscv_rpmi_syssusp_can_resume(void *priv, + rpmi_uint32_t hart_index) +{ + RiscvRpmiState *s =3D priv; + + if (s->machine_ops && s->machine_ops->system_can_resume) { + return s->machine_ops->system_can_resume(); + } + + return true; +} + +static enum rpmi_error riscv_rpmi_syssusp_resume( + void *priv, rpmi_uint32_t hart_index, + const struct rpmi_system_suspend_type *syssusp_type, + rpmi_uint64_t resume_addr) +{ + RiscvRpmiState *s =3D priv; + + s->syssusp_resume_hart_index =3D hart_index; + s->syssusp_resume_addr =3D resume_addr; + s->syssusp_resume_pending =3D true; + return RPMI_SUCCESS; +} + +static const struct rpmi_syssusp_platform_ops riscv_rpmi_syssusp_ops =3D { + .system_suspend_prepare =3D riscv_rpmi_syssusp_prepare, + .system_suspend_ready =3D riscv_rpmi_syssusp_ready, + .system_suspend_finalize =3D riscv_rpmi_syssusp_finalize, + .system_suspend_can_resume =3D riscv_rpmi_syssusp_can_resume, + .system_suspend_resume =3D riscv_rpmi_syssusp_resume, +}; + +static void riscv_rpmi_wakeup_timer(void *opaque) +{ + RiscvRpmiState *s =3D opaque; + + if (s->syssusp_resume_pending) { + riscv_rpmi_hsm_resume(s, s->syssusp_resume_hart_index, + s->syssusp_resume_addr); + s->syssusp_resume_pending =3D false; + s->syssusp_resume_addr =3D 0; + } +} + +static void riscv_rpmi_wakeup_notify(Notifier *notifier, void *data) +{ + RiscvRpmiState *s =3D container_of(notifier, RiscvRpmiState, + wakeup_notifier); + + if (s->context) { + rpmi_context_process_group_events(s->context, + RPMI_SRVGRP_SYSTEM_SUSPEND); + } + if (s->wakeup_timer) { + /* + * Wakeup notifiers run before vCPUs resume. Defer the HSM + * kick so OpenSBI can leave WFI after QEMU restarts execution. + */ + timer_mod(s->wakeup_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) = + 10); + } +} + +static bool riscv_rpmi_syssusp_create(RiscvRpmiState *s, + struct rpmi_service_group **group, + Error **errp) +{ + if (!s->hsm) { + error_setg(errp, "RPMI system suspend service requires HSM service= "); + return false; + } + + if (s->machine_ops && s->machine_ops->register_wakeup_support) { + s->machine_ops->register_wakeup_support(); + } + if (!s->wakeup_timer) { + s->wakeup_timer =3D timer_new_ms(QEMU_CLOCK_REALTIME, + riscv_rpmi_wakeup_timer, s); + } + if (!s->wakeup_notifier_registered) { + s->wakeup_notifier.notify =3D riscv_rpmi_wakeup_notify; + qemu_register_wakeup_notifier(&s->wakeup_notifier); + s->wakeup_notifier_registered =3D true; + } + + *group =3D rpmi_service_group_syssusp_create( + s->hsm, ARRAY_SIZE(riscv_rpmi_syssusp_types), + riscv_rpmi_syssusp_types, &riscv_rpmi_syssusp_ops, s); + if (!*group) { + error_setg(errp, "failed to create RPMI system suspend service gro= up"); + return false; + } + + return true; +} + +static void riscv_rpmi_syssusp_destroy(RiscvRpmiState *s) +{ + if (s->wakeup_notifier_registered) { + notifier_remove(&s->wakeup_notifier); + s->wakeup_notifier_registered =3D false; + } + if (s->wakeup_timer) { + timer_free(s->wakeup_timer); + s->wakeup_timer =3D NULL; + } + + if (s->syssusp_group) { + rpmi_service_group_syssusp_destroy(s->syssusp_group); + s->syssusp_group =3D NULL; + } +} + +bool riscv_rpmi_syssusp_add(RiscvRpmiState *s, Error **errp) +{ + struct rpmi_service_group *group; + + if (s->syssusp_group) { + error_setg(errp, "duplicate RPMI system suspend descriptor"); + return false; + } + + if (!riscv_rpmi_syssusp_create(s, &group, errp)) { + return false; + } + + if (!riscv_rpmi_context_add_group(s, group, "system suspend", errp)) { + s->syssusp_group =3D group; + riscv_rpmi_syssusp_destroy(s); + return false; + } + + s->syssusp_group =3D group; + return true; +} + +void riscv_rpmi_syssusp_remove(RiscvRpmiState *s) +{ + riscv_rpmi_context_remove_group(s, s->syssusp_group); + riscv_rpmi_syssusp_destroy(s); +} diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 7c29e3634c..87399ed803 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -50,6 +50,7 @@ #include "chardev/char.h" #include "system/device_tree.h" #include "system/system.h" +#include "system/runstate.h" #include "system/tcg.h" #include "system/kvm.h" #include "system/tpm.h" @@ -1013,6 +1014,11 @@ static const RiscvRpmiServiceConfig virt_rpmi_servic= es[] =3D { .compatible =3D "riscv,rpmi-hsm", .service_group =3D RPMI_SRVGRP_HSM, }, + { + .node_name =3D "suspend", + .compatible =3D "riscv,rpmi-system-suspend", + .service_group =3D RPMI_SRVGRP_SYSTEM_SUSPEND, + }, }; =20 static uint32_t virt_rpmi_service_count(RISCVVirtState *s) @@ -1030,9 +1036,27 @@ static void virt_rpmi_system_shutdown(void) qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); } =20 +static void virt_rpmi_system_suspend(void) +{ + qemu_system_suspend_request(); +} + +static void virt_rpmi_register_wakeup_support(void) +{ + qemu_register_wakeup_support(); +} + +static bool virt_rpmi_system_can_resume(void) +{ + return runstate_check(RUN_STATE_RUNNING); +} + static const RiscvRpmiMachineOps virt_rpmi_machine_ops =3D { .system_reset =3D virt_rpmi_system_reset, .system_shutdown =3D virt_rpmi_system_shutdown, + .system_suspend =3D virt_rpmi_system_suspend, + .register_wakeup_support =3D virt_rpmi_register_wakeup_support, + .system_can_resume =3D virt_rpmi_system_can_resume, }; =20 static RiscvRpmiConfig virt_rpmi_config(RISCVVirtState *s, diff --git a/include/hw/misc/riscv_rpmi.h b/include/hw/misc/riscv_rpmi.h index 9f7aa9f6ef..a0381e31d7 100644 --- a/include/hw/misc/riscv_rpmi.h +++ b/include/hw/misc/riscv_rpmi.h @@ -49,6 +49,9 @@ struct rpmi_hsm; typedef struct RiscvRpmiMachineOps { void (*system_reset)(void); void (*system_shutdown)(void); + void (*system_suspend)(void); + void (*register_wakeup_support)(void); + bool (*system_can_resume)(void); } RiscvRpmiMachineOps; =20 typedef struct RiscvRpmiServiceConfig { @@ -85,9 +88,16 @@ struct RiscvRpmiState { char *platform_info; const RiscvRpmiMachineOps *machine_ops; struct rpmi_service_group *sysreset_group; + struct rpmi_service_group *syssusp_group; struct rpmi_hsm *hsm; struct rpmi_service_group *hsm_group; uint32_t *hsm_hw_states; + Notifier wakeup_notifier; + bool wakeup_notifier_registered; + QEMUTimer *wakeup_timer; + bool syssusp_resume_pending; + uint32_t syssusp_resume_hart_index; + uint64_t syssusp_resume_addr; uint32_t *hart_ids; uint32_t hart_count; const RiscvRpmiServiceConfig *services; --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916594; cv=none; d=zohomail.com; s=zohoarc; b=GnFwXQTwwTKG6DZuqugBnx8f2A1U+wJbo4SHfT1pADNn7dcy73A5mrMiYZRz+H03BwDjJ+0NbfIRIDMVQv8klGB3nO11tXVZ4UI2DFvE88VLf2HOraFaQjw3g3oRDKUbhYQdaYbfYIR8aRMzgJFsz+tZO671SQD453WyWzRFeew= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916594; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=OZctd9OHmanfQvx7UyW/l8Abrqo79MF42S54z4koBmY=; b=NP/fF7qd8cnGet10pODMlGUsEtbpYjW7HihiLvvqpuZdM29uFAafPueDZNZ3CZ8i/16RkiCs2beGnrWX7P5g9OkOhzzj3o9trq+oF6YrGEwDq6InnOeTcs3peHnxQNxpQlUiQv3xR4482bsZFDPtbL9/p2FJvpqq52fWoa156Hk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916594432907.0176277392068; Fri, 28 Aug 2026 04:29:54 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzum4-00023l-7p; Fri, 28 Aug 2026 07:29:32 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzum2-00021R-2t for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:30 -0400 Received: from mx0a-0031df01.pphosted.com ([205.220.168.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzulz-0007ob-3r for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:29 -0400 Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA7oZX3306745 for ; Fri, 28 Aug 2026 11:29:25 GMT Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb42p9cm1-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:25 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2d6f8afc2f5so2163295ad.3 for ; Fri, 28 Aug 2026 04:29:25 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=OZctd9OHman fQvx7UyW/l8Abrqo79MF42S54z4koBmY=; b=m7rl9MbfkHebsG8ohRQZ3ijS5vc uq+iiMyPWCQBnp8IcEMyuq3SgEIh0QQDLSvAofYv8WkG32JhwZgzXpbUbh2P5OBP Pl8+vxmrdDs8q28Gsk/67vsAth6MuoPzKp2cY/vEByuR7iOWvtCulJ1xMMi/rMhZ ZOVDz+9cQ3/XcKkw4/MAsngncUlLKuwgGTDVT1DYYP7M8lxruX2YGs1+Cg7h5+1j WOLn50XXdpgc3hr7IP/hZLzguCtdC4VJxmU5ivT1igRiprGicKvsjX10Or46RS2Z Zk61Qal9D1FikJ3X1TJxkqNuqABKOE8gC/sA1KeU57dMuE8KkHlf/LByNWQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916565; x=1788521365; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=OZctd9OHmanfQvx7UyW/l8Abrqo79MF42S54z4koBmY=; b=cIBvWKVM09xX8EpkDYR/w2avBVvoRY2VZKjDa9ISSiU4Ii1aQAr14V6oGCG4W7y+lF Y3RGJ8ZVF6X9cvUWFUZb9Yq7B+4uRSiTGTH3s27JwJD/A1idvqtR3zseElo0+u64nYbK w/WH4voJyJgIVTkNRPazLlgXExPVG6cqGQQ3yUtD+6ThNM1RKkfmUugfnQpEC0P64Iim s+H6+x0vyfumkaTIaaaZvJpD0OfTrLEdlzEnAKDvk8eSbjp7YwS7qHA3F4/tdOU7K7eY MUAMK0Ws4s+9ct1A86tKGCRIyQarWPIwo8w6qwLxI1WwQx3xELPnwy2zWyHEvIKMaxs9 rBww== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916565; x=1788521365; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=OZctd9OHmanfQvx7UyW/l8Abrqo79MF42S54z4koBmY=; b=IM9+Twd3FFNxD2f70gqbznnIN6iT0c1LM2QGRilPNOIWB5HYRzszUfrHZyO1kCW/pe rmnjYFsfub3cddksZxMfaYTWD39d0MzeKNJy/Rp4N4I+PVU5Msa+xZEbbvC+VBFpmPjL rv3xmyscxh1X5lR8UHCT1XVHzr/pUwk7HHy4WmYi8WLolngiln0tFdgM9Hqh4XsPY/4D LniKsCfYNlL6B5A2BvtmxrTGRCOQQotyswGIUi9bWFpLfj7ew3MtqSog1oiAh7cG7hD3 WXg9KDLxFpYIc+dKC/Rk8aCoYBpFoZ6oCATIDsR9GaZ564goNUCP+tJy9bW1wS4XAxiz gWMA== X-Gm-Message-State: AFuF++lK5CnnIkVmvbyunqI0xfxHD6vQD3YzdTH0GnyN0mo1wyzQdt82 ATwh6FgWFLRs9p08A5ddnHU5mdFG5raEj+e0oPJsaTABg8Qzr30a97p9mzDuEixEN1d7PQDeuET uNcDUDvZJjRoUWd5oVUnejFXW9GSkuagXuZ1mWP7qJE/VvPYeGx3zn35Sd+SndFNRLg== X-Gm-Gg: AR+sD10Rtxe4QiUoY6SVI1GhKgL1KOqWasY15yFtr+BWpFMYbYdgIsXYsw86gN/OTmd JRJfL02YyGRssWYkp1p+63aZ9Dtwa0Vbkf+djXZ0a/IFkFWjiRlPWaqtBd9tBbtmPTpE4639q4o lXPW+OplfeAjmUHU0E0QKek17UNAvSsQn/TvBWvv/gslnKT/abslhv2mIe7z+f9f4lkXECKs/E/ NtuJiYY1WFQCRCCabUxwJ4nb6J9UbyYiDpHxOd73B+elHeJ1PCNff88SDT3/Nqauvi5lzNXIefy PHxoOBzdFmPo6cZksZ9fD7b39gHraOZdafnYKb/9K1GDqADvE3N7g4cljsjKMIHwLA3pppL+8kS ko1GI8X78/GO5F6xTUa0x8uBulR7FOikcRlZrks7k/V8Td4Zgfn3ERqspqcCdJPUCR5fDc8DKFp /R5mI6DjgBVzOrEFK8fRZ1yTG6gfKrPHc= X-Received: by 2002:a17:90b:3c47:b0:38e:ab3f:2c99 with SMTP id 98e67ed59e1d1-396d0ee934emr6313669a91.2.1787916564759; Fri, 28 Aug 2026 04:29:24 -0700 (PDT) X-Received: by 2002:a17:90b:3c47:b0:38e:ab3f:2c99 with SMTP id 98e67ed59e1d1-396d0ee934emr6313598a91.2.1787916564166; Fri, 28 Aug 2026 04:29:24 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Daniel Henrique Barboza , Pierrick Bouvier Subject: [PATCH v10 08/10] docs/system/riscv: document initial virt RPMI support Date: Fri, 28 Aug 2026 16:58:00 +0530 Message-ID: <20260828112803.86636-9-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: Y4vn6TIjedPB_W4drsWae6N5V8h7FSV7 X-Authority-Analysis: v=2.4 cv=ToDWQjXh c=1 sm=1 tr=0 ts=6a917115 cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=NEAV23lmAAAA:8 a=V1jnuoLLAAAA:20 a=EUspDBNiAAAA:8 a=bNRx8rSjxjkR0t5bZ0UA:9 a=1OuFwYUASf3TG4hYMiVC:22 a=bA3UWDv6hWIuX7UZL3qL:22 X-Proofpoint-GUID: Y4vn6TIjedPB_W4drsWae6N5V8h7FSV7 X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX+T0lbBo8EpOb CxOe9EhsFTO0vAVnz30rhvmOm2FjKqBkdEg6TlS+XGzKalWmydh7OqrHgneB1FdrjkrfrmNXjEN JR0Ad3wmOshUXJFd927ozw0YM5dYJNc= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX/naeyHDhMXgR HClUXy6f1y52Z0KuxGzqG5AGD/Coaf0Uvs9y4As+JMUHKIWuxnYRvm1tjJsaufEPGHbPkmCAWCP FAZ9THp1HoCYXKy5g/mXajAcRizTYFIaEEotE2/4Gj4SQPLWktkAZYkq67EkxkyHiQ+kw7kccRL s+94aItC6hB0ZMN6X/AKgwmCDaw+BOAcDIMu9lSd+BNDUz38Eig05T0l4B8Cbn6O12c6mlo+K/f /wp/v1OmHq1sStl3l2t6lP+rQBbVpVsKj8jxv/S8Bs8rGlqcW7Cj2ulWk8XvizEpfT1bgy3z/M3 irRSG2a6wRpemjoMrj843MQL1xUOJuuG8FCdTBs4cGQQx3JSX2nZOa5ODS41eqAa7yzaEyytYot OrpaX3aOVAwFM4ITrlb0mlKiEUpMIvSvSOtduFjFE3cwIvMVN9WYiFh4JS4gnmxP2GlfgW6NMBU JVrSV7EZCafgXx6BKNg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 clxscore=1015 priorityscore=1501 adultscore=0 impostorscore=0 bulkscore=0 lowpriorityscore=0 suspectscore=0 phishscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.168.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0a-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916595253158500 Content-Type: text/plain; charset="utf-8" Document the opt-in virt RPMI transport and the initial HSM, system reset, and system suspend service groups. Signed-off-by: Subrahmanya Lingappa Reviewed-by: Daniel Henrique Barboza --- docs/system/riscv/virt.rst | 80 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/docs/system/riscv/virt.rst b/docs/system/riscv/virt.rst index 3c87246891..0d719c4c0d 100644 --- a/docs/system/riscv/virt.rst +++ b/docs/system/riscv/virt.rst @@ -149,6 +149,86 @@ The following machine-specific options are supported: =20 Enables the riscv-iommu-sys platform device. Defaults to 'off'. =20 +- rpmi=3D[on|off] + + Enables the RISC-V RPMI shared-memory transport. This option defaults to + "off", is TCG-only, and is available only when QEMU is built with librpmi + support. This support targets the RISC-V Platform Management Interface + (RPMI) Specification v1.0 Ratified (`RPMI v1.0 specification`_). The ini= tial + ``virt`` implementation exposes RPMI system reset, system suspend, and H= SM + service groups. System reset can request shutdown or cold reboot through + RPMI. HSM uses the ``virt`` hart IDs and supports hart discovery, status, + start, stop, and suspend commands. System suspend uses QEMU's suspend and + wakeup path. Migration is currently blocked while RPMI transport and ser= vice + VMState support is being designed. + + The build dependency is provided by `librpmi`_. QEMU requires librpmi 1.= 0.0 + or newer. If the host distribution does not provide a librpmi development + package, build and install it from the upstream source tree so that + ``pkg-config`` can find ``librpmi.pc``: + + .. code-block:: bash + + $ git clone https://github.com/riscv-software-src/librpmi.git + $ cd librpmi + $ make + $ make install I=3D/usr/local + $ export PKG_CONFIG_PATH=3D/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH + $ pkg-config --modversion librpmi + + The librpmi repository can also generate installable ``librpmi-dev`` Deb= ian + packages with ``make deb-pkg`` and ``librpmi-devel`` RPM packages with + ``make rpm-pkg``. After installing librpmi, configure QEMU with + ``--enable-librpmi`` or ``-Dlibrpmi=3Denabled``. + +.. _RPMI v1.0 specification: https://github.com/riscv-non-isa/riscv-rpmi/r= eleases/download/v1.0/riscv-rpmi.pdf +.. _librpmi: https://github.com/riscv-software-src/librpmi + +RPMI qtest coverage +------------------- + +QEMU includes qtest coverage for the RPMI transport and the initial service +groups in ``tests/qtest/riscv-rpmi-test.c``. To run the qtest from a build +configured with librpmi support and the ``riscv64-softmmu`` target: + +.. code-block:: bash + + $ meson test -C build qemu:qtest-riscv64/riscv-rpmi-test + +The qtest covers Base service discovery, System Reset, HSM, System Suspend, +negative transport cases, reset behavior, and migration blocking while RPMI +VMState support is being designed. + +RPMI firmware and guest smoke +----------------------------- + +A firmware-level RPMI smoke test can be run with OpenSBI, a Linux kernel, = and a +RISC-V disk image: + +.. code-block:: bash + + $ qemu-system-riscv64 \ + -machine virt,rpmi=3Don \ + -cpu rv64 -smp 4 -m 4G -nographic \ + -bios /path/to/fw_jump.bin \ + -kernel /path/to/Image \ + -append "root=3D/dev/vda rw console=3DttyS0 earlycon=3Dsbi" \ + -drive file=3D/path/to/rootfs.img,format=3Draw,if=3Dvirtio,snapshot= =3Don + +The OpenSBI banner should report RPMI-backed HSM and system suspend suppor= t. +After the guest reaches a shell, normal guest reboot/poweroff commands exe= rcise +the RPMI system reset path. + +RPMI device tree policy +----------------------- + +RPMI is currently described through FDT only; no ACPI representation is em= itted +for the RPMI transport or service groups. The ``virt`` machine uses the +``riscv,rpmi-shmem-mbox`` shared-memory mailbox node plus child service no= des +with ``riscv,rpmi-*`` compatible strings. These binding names are part of = the +RPMI RFC surface and may be revised if the RISC-V RPMI bindings change dur= ing +review. + Running Linux kernel -------------------- =20 --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916588; cv=none; d=zohomail.com; s=zohoarc; b=me38Dxzz5CJvxjeYFMbeaBNPBF1J3CH6YdkeaKpf1ZpYyZR72586fgGpycVADysEQ8QSXY7k3V6Kq27ZweJ3s8UpodS0OhfHZrBKtCNLErkrQI2mgUnc+Q19esEEh2RC0oVOmbOZfawzdesoc15j1KtwAbZ+a1zPT+zeAI2LuFw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916588; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=32oRSy6+Y4P+D5wN/d8vLZCF0VxeaWGBnwQdtHd/Xys=; b=T3k8cRmo5pSP6oyC7PvqoCqwMWEP9OaY5dc185MgM1C5PKA53HaQXI+uLt2XEP2/z9yKZKhx01h5DsmSV46drn2+JuP4FYtdh70lVCAlN23RLGqAAW/LZJTAz8tkv/roLt9a/U4/1CeTGE3rhtsWXqg4uUcvN+Frp6Ry81JFAfs= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1787916588294789.206909455417; Fri, 28 Aug 2026 04:29:48 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzum9-0002FE-BT; Fri, 28 Aug 2026 07:29:37 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzum7-00027f-AF for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:35 -0400 Received: from mx0a-0031df01.pphosted.com ([205.220.168.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzum3-0007rj-Th for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:34 -0400 Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA7aTn2168318 for ; Fri, 28 Aug 2026 11:29:30 GMT Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb6h00s0t-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:30 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-3883dc4ad23so259719a91.0 for ; Fri, 28 Aug 2026 04:29:30 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=32oRSy6+Y4P +D5wN/d8vLZCF0VxeaWGBnwQdtHd/Xys=; b=bX26yxCX7zQ5w5Ook74damofAVt eWWg4FMdDhjLHsS4GrVJx4IPvPmTz0ooezeIeQ3B/f5GAKzgPnwN2Pxkjkl7jhiw nPd63lCG7wfFYjSevfmzx9JnkF9J3rLGn9n7V2AOAwpR0zeIjC/wQc/FFD6Q147x Dnp4k2YPowUEG/xZqb3dXSuN3uCRXdokCjH/LP60YmY5mhH8DaW0DLEwbgYC+3uO 8XGR0E0kwBiBruDzJDnWaE844lkgbjUZrnUYtuGKfPBhMLgWjknC3Fdxa7vHjBe9 cOJQWZ2A9OlWw7QqxkRAGsKBigPd/1pfUdrhY8Qeh/0xi1gBYiL00gbgnuw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916570; x=1788521370; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=32oRSy6+Y4P+D5wN/d8vLZCF0VxeaWGBnwQdtHd/Xys=; b=ZhsG8myrfpqLl1sG/kB9o9RCL0D3d/rX1i+eEbIio6dA3yA4aNmYHuDmuy83hNd+qY VqWRE0kIHvGwzKinqpR7ab7LoJ6w3Ik4OGHDFzOn9mUMuVDUA43+y/MiGiBa3YWeyvPT b54OCAMtUFXGoYYU3efRXcy+pnrnDA314ElMnXSNqu3MtemwT04OUhYgf9wz9p5xAVgU H1rcoz8kcsjMzVZRIURom/srdanhyIwhj2lSMyvFh3z7tT2CB0sFM0XxMrikRU4Lk+nI 2bOn3MrlJsabN3bqQtaCnL/3HphrQo6P9tWnmBx5tZBhOVpeUs+laUTEsce4srRsIAnE H6fQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916570; x=1788521370; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=32oRSy6+Y4P+D5wN/d8vLZCF0VxeaWGBnwQdtHd/Xys=; b=ES6QZuNvw5t9l1ofaUrJTG9feWvtc5rwFHdZnrNkhShIZbWW+NVeSCaXN8TEL/poYX wvCHmhTDfX7Rpna0G66LXaGhFOqalNnuJ82KaZPOHiiI8RqtwopCwf0gsmBW19vZSVe+ VKYPw03y8d+kUKaqEHxeY24yuksFn++kFu74zCJ5bEDQFxHujdxsFEJgPmowttc+VeFe 8PPn0Z7jF3KSpMsDu4ZLdexIifrlUK6EsEO5psqoDv7FWNGbd7Hw510FFX/v8ipabDar 9qL7rkQ1Bi7LiHJ61aMGEmY7L3T4Cyaje7xq0phY22rhsoSuVB1xKe2lUciVRWwjV6Qh eEoA== X-Gm-Message-State: AFuF++lqAcVgyaiyClq+5PymDndSsYRmL+WAb278Xh1pmCHX6xG8DJaP tkCTvPhStyM7SKtPNTFC51rY5zSL8xPD+tkQNPXrPu8LHwYhaOewo3/2nCdjVaSHomkc0CUtDHE ZGwX4qBQwTic3a2+OZcDoZd+BFQFmIeJt8xDRF/pbdzpVnZw9IeHVd+pUqgvqtt2ndQ== X-Gm-Gg: AR+sD10JCEH253NMk0WTs26mLzN+W/yUb8nkyA6TykuaC9WFwp2VWgOn8EOSzkmYcfx 7kn0x0nU3Z8A1q4WTgoW78zfsc/FqtxxAO3ulHi6kpDp7lbnQL1Am0KX0xrNcD4DoyLybRV2a+e npELnUlENHhe+kAkBPxRB36bMXiBmgGny9qDeruwezXW1PrNMw6CqmhuXbuldhqIqLKwECHWAor 6oAt1HLZGKRMDCHSyEnGTeD1d+hCSZIIxlLuIpX6J3JsvCA2Ig+GDsPpQ6Qxvp83M/zS84VHhc+ RVCH8isiPMYbT1vrQwko5D/0XQ7HmE/2qPP/+3mDIMQ7PwYCk3I8gy2Rr1OnvuJRGwLbDO6vv9V G9R5N5Whb6Y+FqsdvuDXG8dhY3pJjjzRx8663XoubyN6NiOW6ucR7RM68DZFtcfEJEw6QGaKuUS CjsyUV6rxexPPD9abd682Bj/ysyWDXRVc= X-Received: by 2002:a17:90b:35c3:b0:381:77cd:38ca with SMTP id 98e67ed59e1d1-396d0f87846mr5836184a91.4.1787916569362; Fri, 28 Aug 2026 04:29:29 -0700 (PDT) X-Received: by 2002:a17:90b:35c3:b0:381:77cd:38ca with SMTP id 98e67ed59e1d1-396d0f87846mr5836104a91.4.1787916568755; Fri, 28 Aug 2026 04:29:28 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Daniel Henrique Barboza , Fabiano Rosas , Laurent Vivier , Paolo Bonzini , Palmer Dabbelt , Alistair Francis , Weiwei Li , Liu Zhiwei , Chao Liu Subject: [PATCH v10 09/10] tests/qtest: cover initial RISC-V RPMI services Date: Fri, 28 Aug 2026 16:58:01 +0530 Message-ID: <20260828112803.86636-10-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: 6GOdzw8tnAbv05rOwdZKVdPxrj02Xx6A X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX4JUsGd0SuzcP vxG8pdcBb30dDviiTO6ksGOHIJ9PlZDAfEWxJ+iYNTqYl6R7pUIar4GzMzkWUCP3VDyjxI+Ua73 SK6bMwNFYeEpey8Mi+89xh7pm1/rFvI= X-Authority-Analysis: v=2.4 cv=KPpqylFo c=1 sm=1 tr=0 ts=6a91711a cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=AA_4ecdkbvViBBn0OBEA:9 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-ORIG-GUID: 6GOdzw8tnAbv05rOwdZKVdPxrj02Xx6A X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX2InsfTTcheTW nqUKpoYQU/yXiMfN5G5DKbuMHUBTSTpiwbf/74jkgWgESnsKAxo7DrbnyXJpIV4y1xdC8FNLUSx /6g/bbQC7plUJYKp2FdK0UcsLRG7PqfNK3vu4BtXRtnJi0YEtfnfXKSFQWPakLL0EigWXvJJPs6 Po/cGGMqRH/aa9/DUgEyruCT08ZpbiaP7PE7X9EGLq6+JAHC4Gl0TIBcWAfLRBs5qqS1QBhUTAq ZvvEziZUJlK2lGf/HFN/pWL9Yd73DEdf1XjQEYDow9fnNGEYrreHadkMRpHEBS3nnbLpeAcxo5T YJpHotyxksfCELTpth7GhiWh+N4ftojpka7nSu2K2E5Xg+vZoYzgO3/WfD57oKsg5EL8+Yg/2VJ hTxoBUBosaGJsRjrRU3zlS7i2EPES98diUimx3FpXvZzsvNtqJeM0LI/a1vN3cuwG/r4SAioUUQ bAuADS8FdvjYUD0jOOw== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 priorityscore=1501 suspectscore=0 clxscore=1015 impostorscore=0 lowpriorityscore=0 spamscore=0 adultscore=0 bulkscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.168.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0a-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916590182158500 Content-Type: text/plain; charset="utf-8" Add qtests for the RPMI transport plus Base, system reset, HSM, and system suspend service groups. Signed-off-by: Subrahmanya Lingappa Reviewed-by: Daniel Henrique Barboza --- MAINTAINERS | 1 + tests/qtest/meson.build | 2 + tests/qtest/riscv-rpmi-test.c | 625 ++++++++++++++++++++++++++++++++++ 3 files changed, 628 insertions(+) create mode 100644 tests/qtest/riscv-rpmi-test.c diff --git a/MAINTAINERS b/MAINTAINERS index d0973d470c..c2939e5bfa 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -374,6 +374,7 @@ F: hw/riscv/ F: hw/intc/riscv* F: hw/misc/riscv_rpmi* F: include/hw/misc/riscv_rpmi.h +F: tests/qtest/riscv-rpmi-test.c F: include/hw/char/riscv_htif.h F: include/hw/riscv/ F: common-user/host/riscv* diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index cbdef5a545..96f9ba9d4b 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -296,6 +296,8 @@ qtests_riscv32 =3D \ =20 qtests_riscv64 =3D ['riscv-csr-test'] + \ (unpack_edk2_blobs ? ['bios-tables-test'] : []) + \ + (config_all_devices.has_key('CONFIG_RISCV_RPMI') ? + ['riscv-rpmi-test'] : []) + \ (config_all_devices.has_key('CONFIG_IOMMU_TESTDEV') and config_all_devices.has_key('CONFIG_RISCV_IOMMU') ? ['iommu-riscv-test'] : []) + \ diff --git a/tests/qtest/riscv-rpmi-test.c b/tests/qtest/riscv-rpmi-test.c new file mode 100644 index 0000000000..fa23ab73db --- /dev/null +++ b/tests/qtest/riscv-rpmi-test.c @@ -0,0 +1,625 @@ +/* + * SPDX-License-Identifier: GPL-2.0-or-later + * + * QTests for RISC-V RPMI devices. + * + * Copyright (c) 2026 Qualcomm Technologies, Inc. + * Author: + * Subrahmanya Lingappa + */ + +#include "qemu/osdep.h" +#include +#include "libqtest.h" +#include "qobject/qdict.h" + +#define RPMI_SHMEM_BASE 0x10200000ULL +#define RPMI_DOORBELL_BASE 0x10230000ULL +#define RPMI_SLOT_SIZE 64 + +#define RPMI_A2P_HEAD RPMI_SHMEM_BASE +#define RPMI_A2P_TAIL (RPMI_SHMEM_BASE + RPMI_SLOT_SIZE) +#define RPMI_A2P_SLOT0 (RPMI_SHMEM_BASE + 2 * RPMI_SLOT_SIZE) + +#define RPMI_SRVGRP_BASE 0x0001 +#define RPMI_SRVGRP_SYSTEM_RESET 0x0003 +#define RPMI_SRVGRP_SYSTEM_SUSPEND 0x0004 +#define RPMI_SRVGRP_HSM 0x0005 +#define RPMI_BASE_SRV_GET_PLATFORM_INFO 0x05 +#define RPMI_BASE_SRV_PROBE_SERVICE_GROUP 0x06 +#define RPMI_SYSRST_SRV_GET_ATTRIBUTES 0x02 +#define RPMI_SYSRST_SRV_SYSTEM_RESET 0x03 +#define RPMI_HSM_SRV_GET_HART_STATUS 0x02 +#define RPMI_HSM_SRV_GET_HART_LIST 0x03 +#define RPMI_HSM_SRV_GET_SUSPEND_TYPES 0x04 +#define RPMI_HSM_SRV_GET_SUSPEND_INFO 0x05 +#define RPMI_HSM_SRV_HART_START 0x06 +#define RPMI_HSM_SRV_HART_STOP 0x07 +#define RPMI_HSM_SRV_HART_SUSPEND 0x08 +#define RPMI_SYSSUSP_SRV_GET_ATTRIBUTES 0x02 +#define RPMI_SYSSUSP_SRV_SYSTEM_SUSPEND 0x03 +#define RPMI_MSG_NORMAL_REQUEST 0x00 +#define RPMI_MSG_POSTED_REQUEST 0x01 +#define RPMI_MSG_ACKNOWLEDGEMENT 0x02 +#define RPMI_SYSRST_TYPE_SHUTDOWN 0x00 +#define RPMI_SYSRST_TYPE_COLD_REBOOT 0x01 +#define RPMI_SYSRST_TYPE_INVALID 0x03 +#define RPMI_SYSRST_ATTRS_FLAGS_RESETTYPE 1 +#define RPMI_TOKEN 0x55aa +#define RPMI_ERR_NOTSUPP 0xfffffffeU +#define RPMI_ERR_INVALID_PARAM 0xfffffffdU +#define RPMI_ERR_INVALID_ADDR 0xfffffffbU +#define RPMI_ERR_DENIED 0xfffffffcU +#define RPMI_HSM_HART_STATE_STARTED 0x00 +#define RPMI_HSM_HART_STATE_STOPPED 0x01 +#define RPMI_HSM_HART_STATE_SUSPENDED 0x04 +#define RPMI_HSM_TEST_START_ADDR 0x80000000ULL +#define RPMI_HSM_TEST_RESUME_ADDR 0x80001000ULL + +#define RPMI_P2A_ACK_BASE (RPMI_SHMEM_BASE + 16 * RPMI_SLOT_SIZE) +#define RPMI_P2A_ACK_HEAD RPMI_P2A_ACK_BASE +#define RPMI_P2A_ACK_TAIL (RPMI_P2A_ACK_BASE + RPMI_SLOT_SIZE) +#define RPMI_P2A_ACK_SLOT0 (RPMI_P2A_ACK_BASE + 2 * RPMI_SLOT_SIZE) + +static uint64_t rpmi_response_base; + +static uint64_t rpmi_queue_slot(uint64_t queue_base, uint32_t index) +{ + return queue_base + (index + 2) * RPMI_SLOT_SIZE; +} + +static void rpmi_send_request(QTestState *qts, uint16_t service_group, + uint8_t service_id, uint8_t request_type, + const uint32_t *data, size_t data_words) +{ + uint32_t tail =3D qtest_readl(qts, RPMI_A2P_TAIL); + uint64_t slot =3D rpmi_queue_slot(RPMI_SHMEM_BASE, tail); + size_t i; + + qtest_writew(qts, slot, service_group); + qtest_writeb(qts, slot + 2, service_id); + qtest_writeb(qts, slot + 3, request_type); + qtest_writew(qts, slot + 4, data_words * sizeof(*data)); + qtest_writew(qts, slot + 6, RPMI_TOKEN); + + for (i =3D 0; i < data_words; i++) { + qtest_writel(qts, slot + 8 + i * sizeof(*data), data[i]); + } + + g_test_message( + "RPMI_A2P_REQ shmem=3D0x%016" PRIx64 " doorbell=3D0x%016" PRIx64 + " group=3D0x%04x service=3D0x%02x type=3D0x%02x data_len=3D%zu" + " token=3D0x%04x a2p_tail=3D%u slot=3D0x%016" PRIx64, + (uint64_t)RPMI_SHMEM_BASE, (uint64_t)RPMI_DOORBELL_BASE, + service_group, service_id, request_type, data_words * sizeof(*data= ), + RPMI_TOKEN, tail, slot); + + qtest_writel(qts, RPMI_A2P_TAIL, (tail + 1) % 16); + qtest_writel(qts, RPMI_DOORBELL_BASE, 1); +} + +static uint32_t rpmi_response_word(QTestState *qts, unsigned int word) +{ + return qtest_readl(qts, rpmi_response_base + 8 + word * sizeof(uint32_= t)); +} + +static void rpmi_expect_ack(QTestState *qts, uint16_t service_group, + uint8_t service_id, uint16_t data_len) +{ + uint32_t head =3D qtest_readl(qts, RPMI_P2A_ACK_HEAD); + uint32_t tail =3D qtest_readl(qts, RPMI_P2A_ACK_TAIL); + + g_assert_cmphex(tail, !=3D, head); + rpmi_response_base =3D rpmi_queue_slot(RPMI_P2A_ACK_BASE, head); + g_assert_cmphex(qtest_readw(qts, rpmi_response_base), =3D=3D, service_= group); + g_assert_cmphex(qtest_readb(qts, rpmi_response_base + 2), =3D=3D, + service_id); + g_assert_cmphex(qtest_readb(qts, rpmi_response_base + 3), =3D=3D, + RPMI_MSG_ACKNOWLEDGEMENT); + g_assert_cmphex(qtest_readw(qts, rpmi_response_base + 4), =3D=3D, data= _len); + g_assert_cmphex(qtest_readw(qts, rpmi_response_base + 6), =3D=3D, + RPMI_TOKEN); + g_test_message( + "RPMI_P2A_ACK shmem=3D0x%016" PRIx64 + " group=3D0x%04x service=3D0x%02x type=3D0x%02x data_len=3D%u" + " token=3D0x%04x p2a_head=3D%u slot=3D0x%016" PRIx64 + " status=3D0x%08x", + (uint64_t)RPMI_SHMEM_BASE, service_group, service_id, + RPMI_MSG_ACKNOWLEDGEMENT, data_len, RPMI_TOKEN, head, + rpmi_response_base, + data_len >=3D sizeof(uint32_t) ? rpmi_response_word(qts, 0) : 0); + qtest_writel(qts, RPMI_P2A_ACK_HEAD, (head + 1) % 16); +} + +static void rpmi_send_sysreset(QTestState *qts, uint32_t reset_type, + uint8_t request_type) +{ + rpmi_send_request(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_SYSTEM_RESET, request_type, + &reset_type, 1); +} + +static void rpmi_expect_qemu_failure(const char *extra_args, + const char *stderr_needle) +{ + g_autoptr(GError) error =3D NULL; + g_auto(GStrv) split_args =3D NULL; + g_autoptr(GPtrArray) argv =3D g_ptr_array_new(); + g_autofree char *stderr_data =3D NULL; + gint wait_status; + gboolean spawned; + + g_assert_true(g_shell_parse_argv(extra_args, NULL, &split_args, &error= )); + g_assert_no_error(error); + + g_ptr_array_add(argv, (gpointer)qtest_qemu_binary(NULL)); + for (char **arg =3D split_args; *arg; arg++) { + g_ptr_array_add(argv, *arg); + } + g_ptr_array_add(argv, NULL); + + spawned =3D g_spawn_sync(NULL, (char **)argv->pdata, NULL, + G_SPAWN_STDOUT_TO_DEV_NULL, + NULL, NULL, NULL, &stderr_data, + &wait_status, &error); + g_assert_true(spawned); + g_assert_no_error(error); + g_assert_false(g_spawn_check_exit_status(wait_status, NULL)); + g_assert_nonnull(stderr_data); + g_assert_nonnull(strstr(stderr_data, stderr_needle)); +} + +static void test_rpmi_machine_realize_off(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Doff"); + qtest_quit(qts); +} + +static void test_rpmi_machine_rejects_too_many_harts(void) +{ + rpmi_expect_qemu_failure( + "-machine virt,rpmi=3Don -smp 513 -display none -S", + "max CPUs supported by machine 'virt' is 512"); +} + +static void test_rpmi_base_platform_info(void) +{ + static const char expected[] =3D "QEMU RISC-V virt RPMI"; + QTestState *qts; + size_t i; + + qts =3D qtest_init("-machine virt,rpmi=3Don"); + rpmi_send_request(qts, RPMI_SRVGRP_BASE, + RPMI_BASE_SRV_GET_PLATFORM_INFO, + RPMI_MSG_NORMAL_REQUEST, NULL, 0); + + rpmi_expect_ack(qts, RPMI_SRVGRP_BASE, + RPMI_BASE_SRV_GET_PLATFORM_INFO, + 2 * sizeof(uint32_t) + sizeof(expected)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, sizeof(expected)); + for (i =3D 0; i < sizeof(expected); i++) { + g_assert_cmphex(qtest_readb(qts, RPMI_P2A_ACK_SLOT0 + 16 + i), =3D= =3D, + expected[i]); + } + + qtest_quit(qts); +} + +static void rpmi_probe_group(QTestState *qts, uint32_t service_group, + bool present) +{ + rpmi_send_request(qts, RPMI_SRVGRP_BASE, + RPMI_BASE_SRV_PROBE_SERVICE_GROUP, + RPMI_MSG_NORMAL_REQUEST, &service_group, 1); + + rpmi_expect_ack(qts, RPMI_SRVGRP_BASE, + RPMI_BASE_SRV_PROBE_SERVICE_GROUP, + 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + if (present) { + g_assert_cmphex(rpmi_response_word(qts, 1), !=3D, 0); + } else { + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, 0); + } +} + +static void test_rpmi_base_probe_service_groups(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Don,aia=3Daplic-imsic"); + rpmi_probe_group(qts, RPMI_SRVGRP_BASE, true); + qtest_system_reset(qts); + rpmi_probe_group(qts, RPMI_SRVGRP_SYSTEM_RESET, true); + qtest_system_reset(qts); + rpmi_probe_group(qts, RPMI_SRVGRP_HSM, true); + qtest_system_reset(qts); + rpmi_probe_group(qts, RPMI_SRVGRP_SYSTEM_SUSPEND, true); + + qtest_quit(qts); +} + +static void test_rpmi_sysreset_attrs(void) +{ + QTestState *qts; + uint32_t reset_type =3D RPMI_SYSRST_TYPE_SHUTDOWN; + + qts =3D qtest_init("-machine virt,rpmi=3Don"); + rpmi_send_request(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, + RPMI_MSG_NORMAL_REQUEST, &reset_type, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, + RPMI_SYSRST_ATTRS_FLAGS_RESETTYPE); + + qtest_system_reset(qts); + reset_type =3D RPMI_SYSRST_TYPE_COLD_REBOOT; + rpmi_send_request(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, + RPMI_MSG_NORMAL_REQUEST, &reset_type, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, + RPMI_SYSRST_ATTRS_FLAGS_RESETTYPE); + + qtest_system_reset(qts); + reset_type =3D RPMI_SYSRST_TYPE_INVALID; + rpmi_send_request(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, + RPMI_MSG_NORMAL_REQUEST, &reset_type, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, 0); + + qtest_quit(qts); +} + +static void test_rpmi_sysreset_shutdown(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Don"); + rpmi_send_sysreset(qts, RPMI_SYSRST_TYPE_SHUTDOWN, + RPMI_MSG_POSTED_REQUEST); + qtest_qmp_eventwait(qts, "SHUTDOWN"); + qtest_quit(qts); +} + +static void test_rpmi_sysreset_cold_reboot(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Don -no-reboot"); + rpmi_send_sysreset(qts, RPMI_SYSRST_TYPE_COLD_REBOOT, + RPMI_MSG_POSTED_REQUEST); + qtest_qmp_eventwait(qts, "SHUTDOWN"); + qtest_quit(qts); +} + +static void test_rpmi_sysreset_invalid_type(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Don"); + rpmi_send_sysreset(qts, RPMI_SYSRST_TYPE_INVALID, + RPMI_MSG_NORMAL_REQUEST); + + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_SYSTEM_RESET, sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, + RPMI_ERR_INVALID_PARAM); + + qtest_quit(qts); +} + +static void test_rpmi_repeated_reset_after_traffic(void) +{ + QTestState *qts; + uint32_t reset_type =3D RPMI_SYSRST_TYPE_SHUTDOWN; + + qts =3D qtest_init("-machine virt,rpmi=3Don,aia=3Daplic-imsic"); + for (uint32_t i =3D 0; i < 5; i++) { + rpmi_send_request(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, + RPMI_MSG_NORMAL_REQUEST, + &reset_type, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_GET_ATTRIBUTES, + 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + qtest_system_reset(qts); + } + qtest_quit(qts); +} + +static void test_rpmi_reset_clears_transport(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Don"); + rpmi_send_sysreset(qts, RPMI_SYSRST_TYPE_INVALID, + RPMI_MSG_NORMAL_REQUEST); + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_RESET, + RPMI_SYSRST_SRV_SYSTEM_RESET, sizeof(uint32_t)); + + qtest_system_reset(qts); + + g_assert_cmphex(qtest_readl(qts, RPMI_A2P_TAIL), =3D=3D, 0); + g_assert_cmphex(qtest_readl(qts, RPMI_P2A_ACK_TAIL), =3D=3D, 0); + g_assert_cmphex(qtest_readl(qts, RPMI_DOORBELL_BASE), =3D=3D, 0); + + qtest_quit(qts); +} + +static void test_rpmi_doorbell_invalid_access(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Don"); + qtest_writeb(qts, RPMI_DOORBELL_BASE, 1); + qtest_writel(qts, RPMI_DOORBELL_BASE + 4, 1); + g_assert_cmphex(qtest_readl(qts, RPMI_DOORBELL_BASE), =3D=3D, 0); + + qtest_quit(qts); +} + +static void test_rpmi_queue_bounds(void) +{ + QTestState *qts; + + qts =3D qtest_init("-machine virt,rpmi=3Don"); + qtest_writel(qts, RPMI_A2P_TAIL, 0x1000); + qtest_writel(qts, RPMI_DOORBELL_BASE, 1); + g_assert_cmphex(qtest_readl(qts, RPMI_A2P_HEAD), =3D=3D, 0); + g_assert_cmphex(qtest_readl(qts, RPMI_P2A_ACK_TAIL), =3D=3D, 0); + + qtest_quit(qts); +} + +static void test_rpmi_migration_blocked(void) +{ + QTestState *qts; + QDict *error; + const char *desc; + + qts =3D qtest_init("-machine virt,rpmi=3Don -S"); + error =3D qtest_qmp_assert_failure_ref(qts, + "{ 'execute': 'migrate'," + " 'arguments': { 'uri': 'exec:cat > /dev/null' } }"); + desc =3D qdict_get_try_str(error, "desc"); + + g_assert_nonnull(desc); + g_assert_nonnull(strstr(desc, "non-migratable device")); + g_assert_nonnull(strstr(desc, "riscv-rpmi")); + + qobject_unref(error); + qtest_quit(qts); +} + +static void test_rpmi_hsm_hart_list(void) +{ + QTestState *qts; + uint32_t start_index =3D 0; + + qts =3D qtest_init("-machine virt,rpmi=3Don -smp 4"); + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_LIST, + RPMI_MSG_NORMAL_REQUEST, &start_index, 1); + + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_LIST, + 7 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 2), =3D=3D, 4); + g_assert_cmphex(rpmi_response_word(qts, 3), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 4), =3D=3D, 1); + g_assert_cmphex(rpmi_response_word(qts, 5), =3D=3D, 2); + g_assert_cmphex(rpmi_response_word(qts, 6), =3D=3D, 3); + + qtest_quit(qts); +} + +static void test_rpmi_hsm_multi_socket_hart_list(void) +{ + QTestState *qts; + uint32_t start_index =3D 0; + + qts =3D qtest_init("-machine virt,rpmi=3Don " + "-smp 4,sockets=3D2,cores=3D2,threads=3D1"); + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_LIST, + RPMI_MSG_NORMAL_REQUEST, &start_index, 1); + + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_LIST, + 7 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 2), =3D=3D, 4); + g_assert_cmphex(rpmi_response_word(qts, 3), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 4), =3D=3D, 1); + g_assert_cmphex(rpmi_response_word(qts, 5), =3D=3D, 2); + g_assert_cmphex(rpmi_response_word(qts, 6), =3D=3D, 3); + + qtest_quit(qts); +} + +static void test_rpmi_hsm_hart_status(void) +{ + QTestState *qts; + uint32_t hart_id =3D 3; + + qts =3D qtest_init("-machine virt,rpmi=3Don -smp 4"); + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_STATUS, + RPMI_MSG_NORMAL_REQUEST, &hart_id, 1); + + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_STATUS, + 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, + RPMI_HSM_HART_STATE_STARTED); + + qtest_quit(qts); +} + +static void rpmi_expect_hsm_status(QTestState *qts, uint32_t hart_id, + uint32_t expected_state) +{ + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_STATUS, + RPMI_MSG_NORMAL_REQUEST, &hart_id, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_HART_STATUS, + 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, expected_state); +} + +static uint64_t rpmi_hart_pc(QTestState *qts, uint32_t cpu_index) +{ + g_autofree char *registers =3D qtest_hmp(qts, "info registers %u", + cpu_index); + const char *pc_line; + uint64_t pc; + + pc_line =3D strstr(registers, "\n pc"); + g_assert_nonnull(pc_line); + g_assert_cmpint(sscanf(pc_line, "\n pc %" SCNx64, &pc), =3D=3D, 1); + + return pc; +} + +static void test_rpmi_hsm_hart_control(void) +{ + QTestState *qts; + uint32_t hart_id =3D 1; + uint32_t stop_request[] =3D { hart_id }; + uint32_t start_request[] =3D { hart_id, RPMI_HSM_TEST_START_ADDR, 0 }; + uint32_t suspend_request[] =3D { hart_id, 0, RPMI_HSM_TEST_RESUME_ADDR= , 0 }; + uint32_t start_index =3D 0; + uint32_t suspend_type =3D 0; + + qts =3D qtest_init("-machine virt,rpmi=3Don -smp 2"); + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_SUSPEND_TYPES, + RPMI_MSG_NORMAL_REQUEST, &start_index, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_SUSPEND_TYPES, + 4 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 2), =3D=3D, 1); + g_assert_cmphex(rpmi_response_word(qts, 3), =3D=3D, 0); + + qtest_system_reset(qts); + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_SUSPEND_INFO, + RPMI_MSG_NORMAL_REQUEST, &suspend_type, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_GET_SUSPEND_INFO, + 6 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + + qtest_system_reset(qts); + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_HART_STOP, + RPMI_MSG_NORMAL_REQUEST, stop_request, + ARRAY_SIZE(stop_request)); + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_HART_STOP, + sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + rpmi_expect_hsm_status(qts, hart_id, RPMI_HSM_HART_STATE_STOPPED); + + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_HART_START, + RPMI_MSG_NORMAL_REQUEST, start_request, + ARRAY_SIZE(start_request)); + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_HART_START, + sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + rpmi_expect_hsm_status(qts, hart_id, RPMI_HSM_HART_STATE_STARTED); + g_assert_cmphex(rpmi_hart_pc(qts, hart_id), =3D=3D, RPMI_HSM_TEST_STAR= T_ADDR); + + rpmi_send_request(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_HART_SUSPEND, + RPMI_MSG_NORMAL_REQUEST, suspend_request, + ARRAY_SIZE(suspend_request)); + rpmi_expect_ack(qts, RPMI_SRVGRP_HSM, RPMI_HSM_SRV_HART_SUSPEND, + sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + rpmi_expect_hsm_status(qts, hart_id, RPMI_HSM_HART_STATE_SUSPENDED); + + qtest_quit(qts); +} + +static void test_rpmi_syssusp_attrs_and_suspend(void) +{ + QTestState *qts; + uint32_t suspend_type =3D 0; + uint32_t suspend_request[] =3D { 0, 0, 0x80000000, 0 }; + + qts =3D qtest_init("-machine virt,rpmi=3Don -smp 1"); + rpmi_send_request(qts, RPMI_SRVGRP_SYSTEM_SUSPEND, + RPMI_SYSSUSP_SRV_GET_ATTRIBUTES, + RPMI_MSG_NORMAL_REQUEST, &suspend_type, 1); + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_SUSPEND, + RPMI_SYSSUSP_SRV_GET_ATTRIBUTES, + 2 * sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + g_assert_cmphex(rpmi_response_word(qts, 1), =3D=3D, 3); + + qtest_system_reset(qts); + rpmi_send_request(qts, RPMI_SRVGRP_SYSTEM_SUSPEND, + RPMI_SYSSUSP_SRV_SYSTEM_SUSPEND, + RPMI_MSG_NORMAL_REQUEST, suspend_request, + ARRAY_SIZE(suspend_request)); + rpmi_expect_ack(qts, RPMI_SRVGRP_SYSTEM_SUSPEND, + RPMI_SYSSUSP_SRV_SYSTEM_SUSPEND, sizeof(uint32_t)); + g_assert_cmphex(rpmi_response_word(qts, 0), =3D=3D, 0); + qtest_qmp_eventwait(qts, "SUSPEND"); + qtest_qmp_assert_success(qts, "{ 'execute': 'system_wakeup' }"); + qtest_qmp_eventwait(qts, "WAKEUP"); + + qtest_quit(qts); +} + +int main(int argc, char **argv) +{ + g_test_init(&argc, &argv, NULL); + + if (qtest_has_machine("virt")) { + qtest_add_func("/riscv/rpmi/machine/realize-off", + test_rpmi_machine_realize_off); + qtest_add_func("/riscv/rpmi/machine/rejects-too-many-harts", + test_rpmi_machine_rejects_too_many_harts); + qtest_add_func("/riscv/rpmi/base/platform-info", + test_rpmi_base_platform_info); + qtest_add_func("/riscv/rpmi/base/probe-service-groups", + test_rpmi_base_probe_service_groups); + qtest_add_func("/riscv/rpmi/sysreset/attrs", + test_rpmi_sysreset_attrs); + qtest_add_func("/riscv/rpmi/sysreset/shutdown", + test_rpmi_sysreset_shutdown); + qtest_add_func("/riscv/rpmi/sysreset/cold-reboot", + test_rpmi_sysreset_cold_reboot); + qtest_add_func("/riscv/rpmi/sysreset/invalid-type", + test_rpmi_sysreset_invalid_type); + qtest_add_func("/riscv/rpmi/reset/clears-transport", + test_rpmi_reset_clears_transport); + qtest_add_func("/riscv/rpmi/negative/doorbell-invalid-access", + test_rpmi_doorbell_invalid_access); + qtest_add_func("/riscv/rpmi/negative/queue-bounds", + test_rpmi_queue_bounds); + qtest_add_func("/riscv/rpmi/reset/repeated-after-traffic", + test_rpmi_repeated_reset_after_traffic); + qtest_add_func("/riscv/rpmi/migration/blocked", + test_rpmi_migration_blocked); + qtest_add_func("/riscv/rpmi/hsm/hart-list", + test_rpmi_hsm_hart_list); + qtest_add_func("/riscv/rpmi/hsm/multi-socket-hart-list", + test_rpmi_hsm_multi_socket_hart_list); + qtest_add_func("/riscv/rpmi/hsm/hart-status", + test_rpmi_hsm_hart_status); + qtest_add_func("/riscv/rpmi/hsm/hart-control", + test_rpmi_hsm_hart_control); + qtest_add_func("/riscv/rpmi/syssusp/attrs-and-suspend", + test_rpmi_syssusp_attrs_and_suspend); + } + + return g_test_run(); +} --=20 2.43.0 From nobody Sat Sep 26 21:37:07 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=reject dis=none) header.from=oss.qualcomm.com ARC-Seal: i=1; a=rsa-sha256; t=1787916604; cv=none; d=zohomail.com; s=zohoarc; b=ENCmR8G14lv9zjdVEPFbnv2zIRr+EEFJS+dhehwvkbVpA0Y3szPZ+Qh6/nvoLlC5v69gbHs4Fw48PpNW/ixV7CXKKTu6/jrrVH6FNwfUI7yqWFpuUkikibD/0G2T/koUz7nj+IeYSWpGYBxd4PmJgZ88/HN/Hg6ao5ymM59spBA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1787916604; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=qRRwiGrsxIddxqlNmu4g0WsWnr2EbhJrohLUTwLE9dc=; b=mdw0fE3jUuPMtYhZz7wxKL92QauHJ1056gI5YecefabDOg1+yincfj3KJimxi2DgGxX0MntWNZsIh24bdkzahyezL5qDZPVm6SbZMcPcsLwjvTF4x8WQ2WsS5PO2nMEnosYPN4eWfqeShG8WWlXf9t7F3ZNbXNZ0891nEsZtL74= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17879166042211002.7148193004274; Fri, 28 Aug 2026 04:30:04 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wzumC-0002a8-KH; Fri, 28 Aug 2026 07:29:40 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzumA-0002Kb-9H for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:38 -0400 Received: from mx0b-0031df01.pphosted.com ([205.220.180.131]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wzum7-0007sZ-CM for qemu-devel@nongnu.org; Fri, 28 Aug 2026 07:29:37 -0400 Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 67SA8YHa2798848 for ; Fri, 28 Aug 2026 11:29:34 GMT Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gb62h0x23-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 28 Aug 2026 11:29:34 +0000 (GMT) Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-39647e58e3cso236102a91.2 for ; Fri, 28 Aug 2026 04:29:34 -0700 (PDT) Received: from hu-slingapp-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-142e0de4d92sm4997320c88.13.2026.08.28.04.29.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2026 04:29:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=qcppdkim1; bh=qRRwiGrsxId dxqlNmu4g0WsWnr2EbhJrohLUTwLE9dc=; b=CBJv0CuVDcBQ1BsKVZWCbe2mEEx kjtj9rXdCRZorK8llmu8FM/PsH33Y5T5s34WEpiIv7cSkeVnImqnwGkpP02NHbr/ 7l4ZHneev7lq3YiY0UyXfishucotlgHLMd4bFwDX7K5ByewO/CKQ7i/CGBSRCTXa CQCr1/fe+ecObCvzoT+slNrlaPqvaZ44I9PkOBPUIU4eISehUC3XPWsHhI5hV3Of zGFuAfSePeaM2SrjoBXYB0AfL2vPAlWCNA6tQTrhoiq/ny2DqfTtgRenTq/M8QeR Di6bq79N5Qzp6Z5kBhzxmWPzJ18YSNBSys4rIyHu8pSlyo3qSoYyA8vMUgA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1787916573; x=1788521373; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=qRRwiGrsxIddxqlNmu4g0WsWnr2EbhJrohLUTwLE9dc=; b=O2MYC1xKBbnsmjPRcOPlIAwbIwrRKvGfV8ic1GsCgjrZ9lEozctbekce4uhmr3nYHW IT8CBwsLGtDo9Gz78S+BKoyKl20hgkrjJemDzF+8/AY27MWxkXYa/K4jsMFXPpgTUn/L 88ko9c7BNClS+W0ZSV8O9Lqj7F2MlMUfb+i0ppOrdiNoWfAd+UtKsWMRAW1wVij1qROn ihWI9MO7ngxB4GVor/YantoMBWD7crkAeloycFEEAAmIQOIYLdyJC3+xCQsPk0Fsgbk/ tHKrOV4zYoVnzz8eHIp/pzjshSDm3Bwpvvah5j0N0QfW9Y047fUqp5AFqkse1O+AspJj Hnsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1787916573; x=1788521373; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=qRRwiGrsxIddxqlNmu4g0WsWnr2EbhJrohLUTwLE9dc=; b=ob+DZHsdwG1SfY95JdvAXbdGzivfL+U0i7Ey58XLaYbQo0F9OJFNw61H43tDFxGZy+ +5Q8UUWg1iUJevT8glmZRemISuTF1+mxCX6a42tXvRpUq4nykcFsDyXb70aY92SZhs98 Rj3D2Yw5YLoVmps2rX7xIlF0HLHB3Wi2OQUXf/NAJMXt42MBVpi5nOATL0LiO/ilki7O DzLYeGEHYqFua4I53x2nTzdeO7kINC5jLquejwoY6IKnh3VHEMAMBvSJOdCLfeOZ8KR+ S14cFaYOTzb0J/EARfTcJX6kmBGTcS2FD6afvEGoxMeAuC+EQALMC5IkbVGPeIl7pANi AUtA== X-Gm-Message-State: AFuF++l3ZM8RF5lqHMlKvFYBWDHOwLq13vdmQklPepqx7NEscEDbB18g Lm3Kf6gV07Qc7sBOGwyFQ/Sihk4oCW916NsnRhXO8+UPmLuLHa28Z6Lgffp3sowg8mEmdF9G3Tj edDuPPMu2kUky9Hi+towYO+rQfBaks5Q+CAPGYmjDdB657JTuDseRExqaWGR7iE1Dwg== X-Gm-Gg: AR+sD10+Gpsq83h6qDLPi9zon1ZFaOaTiWKHMk9928jFlNV/Z/KLhGERMAZkIJKh7d+ f4UMCK7puPxVD+50DvEjTZ60eYP7G+F9zkxAB13Rx7SoydRImFWkAP+j52wdZEh/t/oofwXZBSj 9lQPT3/TDcie0ixBanp2gOoFFeH5FAgIe3OuKWS/DzuPx2Da9A528/0sHh0NnLjCMGnYaC3ZRIZ z5dQlyjvMXrpC4qvwlRbCyy2z+AYmY7jbVAlcYWMyIO9GsKMvjeSsT4yvEwZvPB1IMPh8Lzjqw9 jttjcwS9gBIUvFjntp19qyxUaWc58QYLGLi9aVK/VrCl5bIa47RqRrPcMTmtZv86/CcD06Ffhhi lA4EOjKG+hv40m9d6cs9ZQPN4A/DVcNYtDjb/H0ckfgAJCucPUmNnBcpy267DmGhpDJYbvKOaui Qxd9s8zrZWOyXSEXFjUDxkckq4U/DQPWI= X-Received: by 2002:a17:90b:39ae:b0:38f:aa76:88b with SMTP id 98e67ed59e1d1-396d1007627mr5715471a91.4.1787916572931; Fri, 28 Aug 2026 04:29:32 -0700 (PDT) X-Received: by 2002:a17:90b:39ae:b0:38f:aa76:88b with SMTP id 98e67ed59e1d1-396d1007627mr5715420a91.4.1787916572471; Fri, 28 Aug 2026 04:29:32 -0700 (PDT) From: Subrahmanya Lingappa To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, Subrahmanya Lingappa , Palmer Dabbelt , Alistair Francis , Weiwei Li , Daniel Henrique Barboza , Liu Zhiwei , Chao Liu Subject: [PATCH v10 10/10] tests/functional: add initial RPMI virt guest smoke Date: Fri, 28 Aug 2026 16:58:02 +0530 Message-ID: <20260828112803.86636-11-subrahmanya.lingappa@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> References: <20260828112803.86636-1-subrahmanya.lingappa@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Info: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX3TmAufyx6Y2z z8f0h/Ul97Y+Vzp2JyT+pIoGNxVHzSQSXmOzKyl5UJCpxplHx16M/qVCONymHnDRJQt67DSH3av WR4Mxk9HNrDMDcQSbFfd1i16t7eY5OY= X-Proofpoint-GUID: iS18cJYOnOqY1QFCffviRJsFcerL3BKP X-Proofpoint-ORIG-GUID: iS18cJYOnOqY1QFCffviRJsFcerL3BKP X-Authority-Analysis: v=2.4 cv=I5dVgtgg c=1 sm=1 tr=0 ts=6a91711e cx=c_pps a=vVfyC5vLCtgYJKYeQD43oA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=Sv0fKeRqtYgA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=rFS5Cn7EypwXJqSoKdAA:9 a=rl5im9kqc5Lf4LNbBjHf:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwODI4MDA5OCBTYWx0ZWRfX1nM1QVOlxluw TGjXfieWWjQFU5Bm948+JDg5YcJV0iRzpZbcDjfSfdfut3iymZdBcjHZ+EHdpnzBZ4x2laA4Lpb jNk47v/k/Na620UKP5G0m8fn1v/LZQxaaMPixJHWEAgasTSIqPBjq6YetSrKFD4syFZ1LuV0Hu7 AQ8V8JkULaORiTD/N6F/HpdsbgMhOhzGBjejZkRLpKlAr9vDLg1BYIoVopBnQFBZVoXI+EQyC0j /XoTOTKn8Bjn1kRxBZ+bAZIiQN1QvUORFjtggKwbGWJCIVLx16vxl+eK4dAMaR2CXf7X1d+FKg+ kB786UnXmZdclAIeH0H8WpUDKqx8aKQ2xIVAMU1qwrRD2bG6bOWj+AGjMbPidrmjTWKCuOtABXa IIH5uZvAcKnRsfP+nWpBUOPN1uHWwBVMn+qEkMDO8tM3ulUSmNn6I4gbm0+ZzoJ3YekWrlrQsn4 UT2Rld62/Ddlw/kUNTQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-08-28_03,2026-08-27_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 impostorscore=0 adultscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 clxscore=1015 malwarescore=0 phishscore=0 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2608280098 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=205.220.180.131; envelope-from=subrahmanya.lingappa@oss.qualcomm.com; helo=mx0b-0031df01.pphosted.com X-Spam_score_int: -27 X-Spam_score: -2.8 X-Spam_bar: -- X-Spam_report: (-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @qualcomm.com) X-ZM-MESSAGEID: 1787916606057154100 Content-Type: text/plain; charset="utf-8" Boot an RPMI-enabled RISC-V virt guest and exercise the initial HSM, system suspend, and system reset paths. Signed-off-by: Subrahmanya Lingappa --- tests/functional/riscv64/meson.build | 2 + tests/functional/riscv64/test_rpmi_virt.py | 184 +++++++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 tests/functional/riscv64/test_rpmi_virt.py diff --git a/tests/functional/riscv64/meson.build b/tests/functional/riscv6= 4/meson.build index d1a3e6c2bf..1b35ba8cd7 100644 --- a/tests/functional/riscv64/meson.build +++ b/tests/functional/riscv64/meson.build @@ -4,6 +4,7 @@ test_riscv64_timeouts =3D { 'boston' : 120, 'k230' : 120, 'tuxrun' : 120, + 'rpmi_virt' : 300, } =20 tests_riscv64_system_quick =3D [ @@ -18,4 +19,5 @@ tests_riscv64_system_thorough =3D [ 'sifive_u', 'tt_atlantis', 'tuxrun', + 'rpmi_virt', ] diff --git a/tests/functional/riscv64/test_rpmi_virt.py b/tests/functional/= riscv64/test_rpmi_virt.py new file mode 100644 index 0000000000..831895103c --- /dev/null +++ b/tests/functional/riscv64/test_rpmi_virt.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python3 +# +# RISC-V virt RPMI Linux guest integration tests +# +# Copyright (c) 2026 Qualcomm Technologies, Inc. +# +# Author: +# Subrahmanya Lingappa +# +# SPDX-License-Identifier: GPL-2.0-or-later + +import os +from pathlib import Path +import subprocess +import time + +from qemu_test import QemuSystemTest +from qemu_test import exec_command +from qemu_test import exec_command_and_wait_for_pattern +from qemu_test import get_qemu_img +from qemu_test import wait_for_console_pattern + + +class RiscvVirtRpmiGuestTest(QemuSystemTest): + """Boot Linux and exercise RPMI-backed services through guest APIs. + + This test intentionally keeps guest artifacts external. Set: + + QEMU_TEST_RPMI_OPENSBI=3D/path/to/fw_jump.bin + QEMU_TEST_RPMI_KERNEL=3D/path/to/Image + QEMU_TEST_RPMI_ROOTFS=3D/path/to/rootfs.ext4 + + Exact RPMI packet command-ID coverage remains in riscv-rpmi qtests. Th= is + functional test verifies Linux/OpenSBI integration paths visible from a + real guest without adding probe hooks to production RPMI sources. + """ + + timeout =3D 360 + PROMPT =3D 'root@tuxtest:~#' + + def _require_path(self, env_name): + value =3D os.getenv(env_name) + if not value: + self.skipTest(f'{env_name} is required') + path =3D Path(value) + if not path.exists(): + self.skipTest(f'{env_name} does not exist: {path}') + return path + + def setUp(self): + super().setUp() + self.opensbi =3D self._require_path('QEMU_TEST_RPMI_OPENSBI') + self.kernel =3D self._require_path('QEMU_TEST_RPMI_KERNEL') + self.rootfs =3D self._require_path('QEMU_TEST_RPMI_ROOTFS') + self.qemu_img =3D get_qemu_img(self) + + def _create_rootfs_overlay(self): + overlay =3D Path(self.scratch_file('rootfs.qcow2')) + subprocess.run([ + self.qemu_img, 'create', '-q', '-f', 'qcow2', '-F', 'raw', + '-b', str(self.rootfs), str(overlay), + ], check=3DTrue) + return overlay + + def _boot_guest(self, smp=3D4): + self.set_machine('virt') + self.machine =3D 'virt,rpmi=3Don,aia=3Daplic-imsic' + rootfs_overlay =3D self._create_rootfs_overlay() + + self.vm.set_console() + self.vm.add_args( + '-cpu', 'rv64', + '-smp', str(smp), + '-m', '1G', + '-bios', str(self.opensbi), + '-kernel', str(self.kernel), + '-append', 'printk.time=3D0 root=3D/dev/vda rw console=3DttyS0= ' + 'earlycon=3Dsbi loglevel=3D8 no_console_suspend', + '-blockdev', 'driver=3Dqcow2,file.driver=3Dfile,' + f'file.filename=3D{rootfs_overlay},node-name=3Dhd= 0', + '-device', 'virtio-blk-device,drive=3Dhd0', + ) + self.vm.launch() + + def _expect_rpmi_firmware_and_linux(self): + patterns =3D [ + 'Platform HSM Device : rpmi-hsm', + 'Platform Reboot Device : rpmi-system-reset', + 'Platform Shutdown Device : rpmi-system-reset', + 'Platform Suspend Device : rpmi-system-suspend', + 'Standard SBI Extensions', + 'susp', + 'tuxtest login:', + ] + for pattern in patterns: + wait_for_console_pattern(self, pattern) + exec_command_and_wait_for_pattern(self, 'root', self.PROMPT) + + def _run_marker_command(self, command, marker, failure_marker=3DNone): + out =3D exec_command_and_wait_for_pattern(self, command, marker, + failure_message=3Dfailure_= marker) + self.assertIn(marker.encode(), out) + return out + + def _validate_hsm_boot_start(self, online_cpus): + self._run_marker_command( + 'echo RPMI_LINUX_HSM_START_BEGIN; ' + 'cat /sys/devices/system/cpu/present; ' + 'online=3D$(cat /sys/devices/system/cpu/online); ' + 'echo "$online"; ' + f'if [ "$online" =3D "{online_cpus}" ]; ' + 'then echo RPMI_LINUX_HSM_START_PASS; ' + 'else echo RPMI_LINUX_HSM_START_FAIL; fi', + 'RPMI_LINUX_HSM_START_PASS', 'RPMI_LINUX_HSM_START_FAIL') + + def _validate_hsm_stop(self): + self._run_marker_command( + 'echo RPMI_LINUX_HSM_STOP_BEGIN; ' + 'if [ -w /sys/devices/system/cpu/cpu1/online ]; then ' + 'echo 0 > /sys/devices/system/cpu/cpu1/online && ' + '[ "$(cat /sys/devices/system/cpu/online)" =3D 0 ] && ' + 'echo RPMI_LINUX_HSM_STOP_PASS || echo RPMI_LINUX_HSM_STOP_FAI= L; ' + 'else echo RPMI_LINUX_HSM_STOP_FAIL; fi', + 'RPMI_LINUX_HSM_STOP_PASS', 'RPMI_LINUX_HSM_STOP_FAIL') + + def _validate_system_suspend(self): + exec_command( + self, + 'echo RPMI_LINUX_SUSPEND_BEGIN; ' + 'if grep -qw mem /sys/power/state; then ' + 'echo mem > /sys/power/state; ' + 'else echo RPMI_LINUX_SUSPEND_FAIL; fi') + wait_for_console_pattern(self, 'RPMI_LINUX_SUSPEND_BEGIN') + wait_for_console_pattern(self, 'PM: suspend entry') + self.vm.event_wait('SUSPEND', 10) + self.vm.qmp('system_wakeup') + self.vm.event_wait('WAKEUP', 10) + wait_for_console_pattern(self, 'PM: suspend exit') + wait_for_console_pattern(self, self.PROMPT) + self._run_marker_command( + 'marker=3DRPMI_LINUX_WAKEUP; echo ${marker}_PASS', + 'RPMI_LINUX_WAKEUP_PASS') + + def _validate_reset_poweroff(self): + exec_command(self, 'echo RPMI_LINUX_RESET_POWEROFF_BEGIN; poweroff= -f') + wait_for_console_pattern(self, 'RPMI_LINUX_RESET_POWEROFF_BEGIN') + wait_for_console_pattern(self, 'reboot: Power down') + self.vm.wait() + + def _validate_reset_reboot(self): + exec_command(self, 'echo RPMI_LINUX_RESET_REBOOT_BEGIN; reboot -f') + wait_for_console_pattern(self, 'RPMI_LINUX_RESET_REBOOT_BEGIN') + wait_for_console_pattern(self, 'reboot: Restarting system') + wait_for_console_pattern(self, 'OpenSBI') + + def test_linux_guest_service_enumeration(self): + self._boot_guest(smp=3D4) + self._expect_rpmi_firmware_and_linux() + self._validate_hsm_boot_start('0-3') + + def test_linux_guest_hsm_stop(self): + self._boot_guest(smp=3D2) + self._expect_rpmi_firmware_and_linux() + self._validate_hsm_boot_start('0-1') + self._validate_hsm_stop() + + def test_linux_guest_suspend(self): + self._boot_guest(smp=3D1) + self._expect_rpmi_firmware_and_linux() + self._validate_system_suspend() + + def test_linux_guest_reset_poweroff(self): + self._boot_guest(smp=3D1) + self._expect_rpmi_firmware_and_linux() + self._validate_reset_poweroff() + + def test_linux_guest_reset_reboot(self): + self._boot_guest(smp=3D1) + self._expect_rpmi_firmware_and_linux() + self._validate_reset_reboot() + + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() --=20 2.43.0