From nobody Fri Jun 19 02:44:26 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=1781127806; cv=none; d=zohomail.com; s=zohoarc; b=SX1X8XuDJazFDjXWqpSJsr5lKxHcIIqbw9WZ1xbFIFxO/XVLjffjl21T8jxVFi1gSFU0s2eYrRMlM0U1gikz5v6PiYuccv/gKFMYTt5CtE/0dMz4MOtMXB1PCO7aamG98YidWVAKNnifyc7hySrxmpDUF8sRmJ3z8yziKhKtreA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781127806; 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=pZIAO/tzWroCgEzjpoZj5lnjJ7EetIqK5We7SK6ra5M=; b=loI8NCF3VIDah08i8//7/NZDDN6pTcfro2g4BIS2Aw+U5+mfmyIjjzf0g0Q4GD8fjlzl6D4UDYmrQcM+Q81ERxQGpCf2XqzvQdcInITkJhq8ZHZ1yWtuXnnq71/3qvShotgCvWpQ9WKje0r7U+DiST9ocgBLGr7QskXxC2FSJ4Y= 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 178112780658263.430195139613716; Wed, 10 Jun 2026 14:43:26 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXQgQ-0006q2-AR; Wed, 10 Jun 2026 17:41:58 -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 1wXQgP-0006lT-3u for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:41:57 -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 1wXQgL-00032I-3b for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:41:56 -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 65AJaCm12621653 for ; Wed, 10 Jun 2026 21:41:50 GMT Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eqe6sggc0-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 10 Jun 2026 21:41:50 +0000 (GMT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-517e054fe07so28713861cf.1 for ; Wed, 10 Jun 2026 14:41:50 -0700 (PDT) Received: from QCOM-UWl2o8bcGT.qualcomm.com ([177.170.117.62]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5a6d777996csm20766280e0c.7.2026.06.10.14.41.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Jun 2026 14:41:48 -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=pZIAO/tzWro CgEzjpoZj5lnjJ7EetIqK5We7SK6ra5M=; b=nNQFwXvGYTOfrjGM/o9XkJmv0Ak eQZ4dh1FZgN21meXmkzT4ufQb+qsrrWEwNhYD1g5RbNHpi7lqd+rh7ru72G6Qly3 cgxzBjupaSQqWQeIm2V4GUnmK05niPQUd87nEO7OZTyjegEDBqVyvSc9v82lDXtQ JC9RHpjbxqsa1tu1f/C3jRB53GOK1cq+1nA2clQzgVxlbbBLM1o7JyswcK6dwgbd zqKEjJrEY0LEzH7RnTKoDpCJp4h1y3ibt3r+GUBL2X/pMt9+IDIoyqvxZ4Hb55GW DUuNSl4fywyMl0wl5hPXTCfk9ntidbjqZSVgoM6bbR8CIrvwwl7elju1inw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1781127710; x=1781732510; 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; bh=pZIAO/tzWroCgEzjpoZj5lnjJ7EetIqK5We7SK6ra5M=; b=CvA6zVWhBPkrUm1GChsDuOFpF8xBfR90aaIBrxeqNe8uvHm4AOuRo1paLGyEQt9esa rJQdV5FBpIFLbwSRYbkEO4f+vFpSzdhJDGjh32aPvVKxYWITzwhix1AkbtcsMkyaDe2U YaIz8QvTaywarEDsxZNA2AURnIG/JRViLttLgNWw0hzINJ/H8lcWmJaJxNSilJfJ5SgM JLWKzn3ivURlzNgrY2f97glCiBtDyTMGF1Fvei7OeWvn4wjzxFQe2wlHyPu6plNKkn2b Eu/Pu8/Qt7cJH9J0GCGamDB9+MHDN34YEz82voy3MOCx4BEVbomU1B5ikDl4uFZsMacZ ys7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781127710; x=1781732510; 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; bh=pZIAO/tzWroCgEzjpoZj5lnjJ7EetIqK5We7SK6ra5M=; b=EMl7gjEaAGDzWu8oZvB74VZXF8er03Dx4odglCvbUzzqrjqOeTIy5xBAHGGk/BD/Mm Sr5g+xS0/1fkgVZo43p+dujzHuwoPccb4bb1kdcJ5euItjGdvtkvyIQiNIGfL9OV4SKQ Uw6Juid1wX3E8a9Gef+N3SEJKU9nrNT7nGljk4xEajNN+PkNyzNIyupp3wTq/PVzh7ya m/lDYx3PATVi8SjDEYFCEJrdP2VnY6X7o+tAA8oz4tLdA0VBzyfukHBMmq8DqOpPoD90 yx5rpXFCx4HDZaNcgrjWRzRQo4avCJG3vdX7NNR7TofhncL7Xpc0fu9eKB7Ga/45C/Iq MyTQ== X-Gm-Message-State: AOJu0YyE+nXU8jXsUhhS37GZXlADfgfHQkaaz4JRcpZFGa5KX9mhO1NT JSJIt1KUEbGJThXcMBdvDUGfTphvZcGgULyEIu0+vhu0uHp9MRgrXMgMSQDmX5Dp7wfi20XkqLo ZQG6GYUoYYxYsddjo04smFmST1lprqiQynoV+/mVyYKTPUQmaV2TNM6OgEPs9GMuygQ== X-Gm-Gg: Acq92OGxWlbed4YekQANXCNk2h+1mcFMf5XJzmGClxfsJw7Q3f2QpxXpHLS2Zu0oELf L0ieW3iKxp1fs+cLMJvGqfjmol3EOAymAymRTynE4avfiJEoE4RvvX+dKT/IUXouj4ACNDe06w7 +SFDLjAmX1hZI2bgp622XZnKJ84N973JrQAEvUmRtr58s40pNXpICYbl0im7Q2qwZO10s9vCA87 qShMsX1yBjdTgg9UG5PaVubd5qeE7R5UTvTHLmqKsPEWmBMI8LZNoWYzSaSM7KCo00CNASjqz9X R3HcbE0nAdaVjzEvOw2mq+G8EqoTVr9RAj0UyOosWD7MpMUooEtkBq2kB37YSW42A30M7pGO3hF pGwtKdP4zqCcknFUT3TZgB4ks9SOxVT/VUoYaFDA1c4gF3BxPY6XX2hqB66kB0v1Afa5+TQ== X-Received: by 2002:a05:622a:511:b0:517:57f5:e21a with SMTP id d75a77b69052e-517ee28dbdcmr521001cf.41.1781127709790; Wed, 10 Jun 2026 14:41:49 -0700 (PDT) X-Received: by 2002:a05:622a:511:b0:517:57f5:e21a with SMTP id d75a77b69052e-517ee28dbdcmr520491cf.41.1781127709293; Wed, 10 Jun 2026 14:41:49 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, andrew.jones@oss.qualcomm.com, leif.lindholm@oss.qualcomm.com, uwu@icenowy.me, Daniel Henrique Barboza , Palmer Dabbelt Subject: [PATCH v8 1/7] target/riscv/cpu.c: remove 'bare' condition for .profile Date: Wed, 10 Jun 2026 18:41:27 -0300 Message-ID: <20260610214133.1882563-2-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> References: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: hHFKR_GB4V4xOjyHh_peSByl2zTtEor2 X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX9aRTfxmhLn84 KH+5lBLwdREtNGBJ87oP88Maw4O5kVvtpJ+Gb/1nV6H9rEpDxv61Mr+UlzlWrlkAEBexVV1Ryi/ V1DEgQBZWReW1MpH+Gz/697TsfynrOE= X-Proofpoint-ORIG-GUID: hHFKR_GB4V4xOjyHh_peSByl2zTtEor2 X-Authority-Analysis: v=2.4 cv=Kux9H2WN c=1 sm=1 tr=0 ts=6a29da1e cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=gdiugJE53z4H+vvYeRBHqw==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=JF9118EUAAAA:8 a=GhL2bEVCvcqOW28JNKkA:9 a=uxP6HrT_eTzRwkO_Te1X:22 a=xVlTc564ipvMDusKsbsT:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX2IEH2806jy6V rfNXwQJvv3dKFqSLfsM8ReHgkzE0KcjNrqKAk3DMpSiJoXoTNEaYkqms0v/7fd0njFDEXKQMM7e 3w1cq9vRYb8Zv4vXq2rYVnlobvO6uxT0lBiWbr0zNWp8E+fELhPrX/Gg/+/h4xF/uoweb73AVR1 xGTeCuKFZF5Py9I0rYTrDJfvibfwOlDrdc4lisKek35bWH0Y3taE+IGVIZu5S23G7TwepHN+WXI GtKUVvD0pauFmDe5LrHhWG0mFHxW0FkqLmlZfAnz05YZTDhS0ZZCl9sBkit545myNvkzC9WkUJ8 nQjJE9LsSzfV9zUOuh8cnwlbSPjBzMC2XULlFEneRwaEhmeeTGKdeeHFi0xVK+W2tAPH4yEA6XO QEkFs6jlugZaI9YiCBFs85iLUiGh9BXiwdGcGQrooSJ87ivfpUSrRC/PrcVrNi/K8+1ncehXjaj 5h2zwVsS0UxnRIsJZHQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-10_04,2026-06-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 malwarescore=0 phishscore=0 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606100207 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=daniel.barboza@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: 1781127808082154100 Content-Type: text/plain; charset="utf-8" We want to configure other CPU types to use profiles as an alternative to adding every profile extension explicitly, i.e. a profile is nothing more than an extension bundle. This means that a vendor CPU can set .profile=3Drva23s64 while having the same handling as any other vendor CPU. Same thing with all other CPU types. Signed-off-by: Daniel Henrique Barboza Reviewed-by: Andrew Jones Reviewed-by: Alistair Francis --- target/riscv/cpu.c | 1 - 1 file changed, 1 deletion(-) diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index 6423f2d548..e02d53cbba 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -2744,7 +2744,6 @@ static void riscv_cpu_class_base_init(ObjectClass *c,= const void *data) mcc->def->bare |=3D def->bare; if (def->profile) { assert(profile_extends(def->profile, mcc->def->profile)); - assert(mcc->def->bare); mcc->def->profile =3D def->profile; } if (def->misa_mxl_max) { --=20 2.43.0 From nobody Fri Jun 19 02:44:26 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=1781127791; cv=none; d=zohomail.com; s=zohoarc; b=VY3aG4mgp1AhJMCvumQDsZw8z7bUXklMo3hBZkMn4J6QzEEKwLANmJTVeW0SLAUwaDpyykc8qM9ItaX1INLFl0blv+m+QHQg/vC9eIaOidR0F/W+BwBBxcqLMn5ROCdn2kJKlfI7qFoSzrU4k6FPohAp3qJBraYDd0VvcEWU7m0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781127791; 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=cQWKhavUm6ZCmKPPrdzelKxZNHx3Yewo+bUhJ968rOw=; b=G3p9wotrflgZnpjlykq6IF8E0nkwhM3Szb7X+bjLjfpj/9jkEtv3mT6dgbBttDRIsbMmhOesT8rf5QoHQ7RrqwCZdAiCK0R/5DW0+qUT7zjOXDNfxdivGn4140BSzMs6lp7LDlTn8Cdy4LKBE0glxhlI6zx4L/LGzunpGCmBHkM= 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 1781127791554421.66590797196307; Wed, 10 Jun 2026 14:43:11 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXQgT-0006wQ-4g; Wed, 10 Jun 2026 17:42:01 -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 1wXQgQ-0006ri-IC for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:41:58 -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 1wXQgN-000348-Ty for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:41:58 -0400 Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65AJYXu32471976 for ; Wed, 10 Jun 2026 21:41:55 GMT Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eqe6u8ews-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 10 Jun 2026 21:41:54 +0000 (GMT) Received: by mail-qt1-f200.google.com with SMTP id d75a77b69052e-5178ae66ff3so115580061cf.1 for ; Wed, 10 Jun 2026 14:41:54 -0700 (PDT) Received: from QCOM-UWl2o8bcGT.qualcomm.com ([177.170.117.62]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5a6d777996csm20766280e0c.7.2026.06.10.14.41.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Jun 2026 14:41:52 -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=cQWKhavUm6Z CmKPPrdzelKxZNHx3Yewo+bUhJ968rOw=; b=QPNXgqSkMS5psYeTQC1DVN6cRZy tJN/6VEqFNiswxDPM9u6p4xS3A7K1K6/n6mly4ED+G/jwFjGc3ZERC27pQTVMeR3 cHfmHPK/71qkGigApvIPW4r7HMGoEdsn9UMHUUvY1fV1V+KcA61pBGiBwfP+rAEK uhdRq37WUFi2S5Xh9iHKf6w76AMAbbJXxxowwrnD11aUfxYxTziG/wzZ0NXievCj 8ZqrdGa9iFMymtvwqH8uliwwc+8JEpOQvDPMIBMKKokTM/aEBAw6VOPp3nk0iSeH 1jQmiKH0cjQxB+BAovYceEeb2cIAO4qFH0KveZfVjuy5wnMX4DRNW6QNNXQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1781127714; x=1781732514; 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; bh=cQWKhavUm6ZCmKPPrdzelKxZNHx3Yewo+bUhJ968rOw=; b=NWAV6azsHfss6vfSQwm/QLo8fROtn4rSdxw7m6TW0Om47z13KVETOV0oYFkvakAYR/ T4sTr1AJ7Ek2qEnp23m8gZD2VhXwxJGdc3UmC0yrRjp9PXlNbg9bCyMYcSl6NYQtrrWR KJlx3NihTx3Y3/L/1+lnrdniGB3G47d1RwepStY2JDuyRuG3XAz3eVTCkw1/MhbR2VXv tgEB7cqeYPJZXbIYbpXMkHjv9Vu6OQU/DIuORruj31djXsMQXu7ODsIbJZebWxEHgpV3 PggMJtlTUdAzfQmihg0pz3vpIn+rvTXXlNhJpJxMw4sbg/JDVG1Phge5/QW3qLRutJx5 xLsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781127714; x=1781732514; 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; bh=cQWKhavUm6ZCmKPPrdzelKxZNHx3Yewo+bUhJ968rOw=; b=gKOivTH2BCsZZ+yYH3OA/tb5BYfnGAHM1rrQTag9r7LrFwlkIJwSMtd6rDczAc/wSe TO5wzfJuc0BsCnCRuMjGKXhMe71P++aPrNCUko2zu/Vgkp3YrB/X48JYkTG9jrQ9aByA V+0Ll13DepNjyubA4NSwKIcN9FFBedr3hdSyW6UF202aKK23m8ZEJ5vCus/W03yI5O3q 609+u7Df4OcYhdxdtwhpnVzkFs82jN0p8u9DDf2hafOj0AQgm19jiAH0FddQNNL3v8Kx X6Obc6R05l+uZ4liApFwNDCFUj78ruB4uBaSIIl7IdiqOepgdvWzTJOBeOujafFkr7iF i1FA== X-Gm-Message-State: AOJu0YwdE42a+ozs42ohpdZEuQ4zdcX/X2Z49CM/R9rMlA0PYucum5M3 hXtYoPXUweu7Z9v4RQiNdTgG2hDj34Afy5FEkqfrgHe6Yg/hcIw7lBtbu57CikdjqZdSnlIIFdV wgyvrxmOFjQ5QAf8jV/s5haMHRDrFfBruxvQ+evCdzRkf3eYV1O2T9fRw6au6Jv0yEg== X-Gm-Gg: Acq92OGC4o/JKBMwzNIjgoAJoqonvymJeuqiMv86y2zukypfSjrfLGw734/Ose7FBol s2O/YZsUi1fEuxJdM+eP+1ooQvt5bpORhI2PJa9NkM1/hSlRY0YJEAeWdo1LUIf5Po+JTDygfWp UxQ0uUIHO7bVPsYwKeRt38kR+MAwxPy+4PCeez6jfMIXKHmEj3Rtkfi1yqPybd4UaY03Sgz4YL0 Yz/nAYKAE2ttz75lqItEiGPC2Jz78ed/CiyNJf0pLZXGFOVcgKBDFhzbnvtxaFyzBnvgxdWgDVQ lgjzbkoTsnqeWO8cHE8vYphirFjSRdoyXTd00OrUld/QHzWEnb0dDhwk32OpbpVKH5osg/FcrP0 OJ/5c+k+LtMIxQpjDs0q5ofix9AI+KiLe4Sp4uitVJU+LZrh/ujp2cdEFv1fSsvzPfXYtLg== X-Received: by 2002:a05:622a:992:b0:517:6a26:43b with SMTP id d75a77b69052e-517ee217ec8mr601691cf.44.1781127714123; Wed, 10 Jun 2026 14:41:54 -0700 (PDT) X-Received: by 2002:a05:622a:992:b0:517:6a26:43b with SMTP id d75a77b69052e-517ee217ec8mr601271cf.44.1781127713693; Wed, 10 Jun 2026 14:41:53 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, andrew.jones@oss.qualcomm.com, leif.lindholm@oss.qualcomm.com, uwu@icenowy.me, Daniel Henrique Barboza , Palmer Dabbelt Subject: [PATCH v8 2/7] target/riscv: add riscv-server-ref CPU Date: Wed, 10 Jun 2026 18:41:28 -0300 Message-ID: <20260610214133.1882563-3-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> References: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX5KHs6KpzIdrS lxzw9dq6uLP/3NSoqFdwnrTdW7a+FQLvIgK0XRDSkdftNJHwlv3VyL5lEY0oKEkjeAGxdBSQd1V MqspTqeJVsPSVGveDbe4GpVu1Wrs7q4= X-Authority-Analysis: v=2.4 cv=atOCzyZV c=1 sm=1 tr=0 ts=6a29da22 cx=c_pps a=JbAStetqSzwMeJznSMzCyw==:117 a=gdiugJE53z4H+vvYeRBHqw==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=V1jnuoLLAAAA:20 a=EUspDBNiAAAA:8 a=RyS-KtFGDtHqjiiJgvUA:9 a=uxP6HrT_eTzRwkO_Te1X:22 a=bA3UWDv6hWIuX7UZL3qL:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX/+KcLoR1UwsE j474z7LuL0AH077NlDeuZ3KRHZYKYFhPTQDMnFf36IPlq0S4l0mT4xEZ9nPH/GXYN73nE1xpdH1 7/CKPUZi/td8T80NreCXhoyTQ3SSmEAyziDLEV070NwcPFoAV/h9/sCvc6nUI/HExL2FPYSSn17 QR/x3BcS1ltbF+7GyaBZnYTDMS2oIhk/rI2eEDgmvogv0M2hEy6Ztxl+1DMlDY+RUdxIzaHWzE2 11Ksfdb7z+MQ5kf7TITjBDjiG9pfzsV1s5Tz0YLk8SnaWwtF4EzBvpwdt3O7BORhNLxhzSIrMue U/WMUptm1LJWtZ8hzkUmUS67SiOcRLvJxJLyKHkAX45+NopzQXMyrdKR1F0TzBCOk+qZonep6Eg 7m18sk4K/7Lkp6x8JzKT2tPvsecxih2y/AUlWFKdTy8/dj5cIwxQSkkD9TY9UJ9BAOrcfPotxAY fG07pzcUR1Hi4c6VPAg== X-Proofpoint-GUID: KzzRkp4D8RCPYOCPhrNOwQznoEhVaHWS X-Proofpoint-ORIG-GUID: KzzRkp4D8RCPYOCPhrNOwQznoEhVaHWS X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-10_04,2026-06-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 impostorscore=0 bulkscore=0 clxscore=1015 spamscore=0 malwarescore=0 phishscore=0 priorityscore=1501 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606100207 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=daniel.barboza@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: 1781127793741154100 Content-Type: text/plain; charset="utf-8" The harts requirements of RISC-V server platform [1] require RVA23 ISA profile support and others. We're going for a profile-based implementation, instead of a regular CPU that can inherit RVA23, to allow future CPUs to use it internally as a starting base for their own extension sets. There's also a new 'rvserver-ref-1.0' flag that can be used to set the extensions in the command line for other CPUs, which can be used for testing/debugging purposes. Note that for all intents and purposes "riscv-server-ref" is a regular CPU and no, we're not trying to set a precedent of calling the riscv server platform spec a profile. [1] defines in rule SEE_020 that we must support at least 11 debug triggers (4 for insn address, 4 for insn load/store, 1 for icount, one for int, one for excp). We're going for the minimum. If more triggers are needed users can set any trigger amount with: -cpu riscv-server-ref,trigger-count=3DN Note that N must be <=3D 128. [1] https://github.com/riscv-non-isa/riscv-server-platform/blob/main/server= _platform_requirements.adoc Suggested-by: Icenowy Zheng Signed-off-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Reviewed-by: Matheus Ferst --- target/riscv/cpu-qom.h | 1 + target/riscv/cpu.c | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/target/riscv/cpu-qom.h b/target/riscv/cpu-qom.h index 30dcdcfaae..a150acd151 100644 --- a/target/riscv/cpu-qom.h +++ b/target/riscv/cpu-qom.h @@ -42,6 +42,7 @@ #define TYPE_RISCV_CPU_RVA22S64 RISCV_CPU_TYPE_NAME("rva22s64") #define TYPE_RISCV_CPU_RVA23U64 RISCV_CPU_TYPE_NAME("rva23u64") #define TYPE_RISCV_CPU_RVA23S64 RISCV_CPU_TYPE_NAME("rva23s64") +#define TYPE_RISCV_CPU_RVSERVER_REF RISCV_CPU_TYPE_NAME("riscv-server-= ref") #define TYPE_RISCV_CPU_IBEX RISCV_CPU_TYPE_NAME("lowrisc-ibex") #define TYPE_RISCV_CPU_SHAKTI_C RISCV_CPU_TYPE_NAME("shakti-c") #define TYPE_RISCV_CPU_SIFIVE_E RISCV_CPU_TYPE_NAME("sifive-e") diff --git a/target/riscv/cpu.c b/target/riscv/cpu.c index e02d53cbba..63fbc4b98e 100644 --- a/target/riscv/cpu.c +++ b/target/riscv/cpu.c @@ -2063,11 +2063,35 @@ static RISCVCPUProfile RVA23S64 =3D { } }; =20 +/* + * The riscv-server-ref spec isn't a profile per se but its + * CPU definition can be modelled as a profile that extends + * RVA23, with additional things on top of it, and allowing + * future CPUs to derive from it via + * ".profile =3D &RVServerRef1_0;". + */ +static RISCVCPUProfile RVServerRef1_0 =3D { + .s_parent =3D &RVA22S64, + .name =3D "rvserver-ref-1.0", + .satp_mode =3D VM_1_10_SV48, + .ext_offsets =3D { + CPU_CFG_OFFSET(ext_zkr), + CPU_CFG_OFFSET(ext_sdtrig), + CPU_CFG_OFFSET(ext_ssaia), + CPU_CFG_OFFSET(ext_ssccfg), + /* ssstrict is always enabled for PRIV_VER_1_12 */ + + RISCV_PROFILE_EXT_LIST_END + } +}; + + RISCVCPUProfile *riscv_profiles[] =3D { &RVA22U64, &RVA22S64, &RVA23U64, &RVA23S64, + &RVServerRef1_0, NULL, }; =20 @@ -3326,6 +3350,13 @@ static const TypeInfo riscv_cpu_type_infos[] =3D { #endif ), =20 + DEFINE_RISCV_CPU(TYPE_RISCV_CPU_RVSERVER_REF, TYPE_RISCV_BARE_CPU, + .profile =3D &RVServerRef1_0, + .misa_mxl_max =3D MXL_RV64, + .cfg.max_satp_mode =3D VM_1_10_SV57, + .num_triggers =3D 11, + ), + #if defined(CONFIG_TCG) && !defined(CONFIG_USER_ONLY) DEFINE_RISCV_CPU(TYPE_RISCV_CPU_BASE128, TYPE_RISCV_DYNAMIC_CPU, .cfg.max_satp_mode =3D VM_1_10_SV57, --=20 2.43.0 From nobody Fri Jun 19 02:44:26 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=1781127765; cv=none; d=zohomail.com; s=zohoarc; b=Z96PaZHLCRBTfnTprU2EyOpFpGxkbQB54PWNk2CF4KroEUEOGfZqXv+w2tchFxaTEENXQ8PQgkWPYiuMeTVWYYCVaGl6/olOLdQSObL7sooMjQLLoEY0+HvHVlWzMrD4k88wxDjDlit21RcIfupi4zMIOpliomVHVi8OBjmrnr0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781127765; 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=lLd0Jp42P9m/l9D9QpRimmcsBVd4PS5rsrCJqBao+AM=; b=A6cP6OUi8SAIZz4hxAo1vRflmx0+LeJBqCG66r+qjKtCjW77Gl9wjj7rtNW4R2aRzgy7hwE2SdohW4Up/5jryNAcN20h6M68G0ZwpaD+I9uL/TtJQ1Gc4nULt9fH/odor5+nBCPZIZNMKeYTr5Qxp45UoXpAeHpc0+raiamo15I= 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 1781127765600461.11581315579724; Wed, 10 Jun 2026 14:42:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXQgt-00073j-Up; Wed, 10 Jun 2026 17:42:27 -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 1wXQge-00072o-L0 for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:12 -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 1wXQgU-000399-Sw for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:07 -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 65AJY7Ej2618039 for ; Wed, 10 Jun 2026 21:42:02 GMT Received: from mail-qt1-f199.google.com (mail-qt1-f199.google.com [209.85.160.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eqe6sggcp-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 10 Jun 2026 21:42:01 +0000 (GMT) Received: by mail-qt1-f199.google.com with SMTP id d75a77b69052e-5175bf22b1bso101327281cf.3 for ; Wed, 10 Jun 2026 14:42:01 -0700 (PDT) Received: from QCOM-UWl2o8bcGT.qualcomm.com ([177.170.117.62]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5a6d777996csm20766280e0c.7.2026.06.10.14.41.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Jun 2026 14:41:58 -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=lLd0Jp42P9m /l9D9QpRimmcsBVd4PS5rsrCJqBao+AM=; b=SmCq1oXwlON1e+eYZpdygkXjMwE 30Z+Fi6JV5NO2Lnr15rr6/i+UbJqWTTdLvM0DZBgPziNzgtNwW3669G3hDG3VR0e V7hSembeKknGxr6qujGwV+Jq8M7QYR2rr3Ppe/zSBXyzY7NQ8sicuoUy7f089/wD CkC1gz+jfCHWX4uIX7l71uzOeGvQpifZlVEJQgRdBZjqHJP3WfY8sFOoLFhrwTpd ULpKRfGNeq9+jsXjZkjN0i+/hGdN48fgeWARNTKtK5K2pWNiIdsXQsvNUL77LD0m MEjAzHGncJuEmCPmBQhE5EWnK4TX+olHATWq/gGkvGSOxYzxBi7XLf75lSA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1781127721; x=1781732521; 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; bh=lLd0Jp42P9m/l9D9QpRimmcsBVd4PS5rsrCJqBao+AM=; b=YI8qmj1CWpQDpX3y3ejQt7HhHf7WcpahWSoHzq82tDFiqju5f0+8CiNWY28ZU8/mGo E5u3fPjxVzJBm9ehn6Lq5KYny+s6pEWtj3AwFWpE6gG65zKyC9s+6XZKwxt1exLMLa4D /LPy6HofikE72mt2fKmFj6y/1h6Q1zak/99c3Kh8vOqjPzOlFERjoeUzcB73ZBvQmpmG pnmZ71DGHmgOgPG+ftRG2BqvidibXVDOigzAF4eGNAoxjeoNfohhGvTFKEfews8d/yca jNLTjqJ1k/Z+O1rN0mtje92A+jCYdGzmnZxIhMDqXeE8pb1YlHJYhGKfC18a8/FwYp6L ejYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781127721; x=1781732521; 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; bh=lLd0Jp42P9m/l9D9QpRimmcsBVd4PS5rsrCJqBao+AM=; b=eHtBY9W6WLYehShkwBgAzyMgSSdz/7XxZwmy7wmMQHRNFyQsufiSY47d/fkfhdHBTE tXnyrjLkrRRlvGc4BBQJimFELiJuCL9qD21puhhFg/5dZu80tXzzsOmPeticIoqcNZox jPS6sLWnphGtsR/XqiuxB70YdDAudfQ4DOa1pALDmiXBwp0CLUtndu2KKR9wpVpZPtGE YLK/b9tAHWLOx/6hvhxAZbhDDxnep2nvjtdCTmT3YpEn8SJ29yy3AKY3EUQf2mJ560Vz reMSRPgb6xffdVhI9IisW+r7hoHdN8AApb+n0lzjPO8moAzPUFyF8xINpAO9IqzMn+bL vh3A== X-Gm-Message-State: AOJu0YxufWAiJJ/h5G2RiwaQLjNWYi1LPHY9SXH/ZcE+EO3IzxyvWjZa 94ErtSbP/mRF6YlaczRCuHLU+Vmj7XxPe7T8ph61L5UxbTau1f+epVigEmTa/j01y4mJp7m8gQF w5Oy1NmgIOozXtkKNxqxcB7h6L3REodhFAB3rDFsxkcfsq/DFyiDAoUzqmVn7/6Q0Ow== X-Gm-Gg: Acq92OGDYwCob51V1XY8ontbjUGPFzP4S/u0z2shHQI3dCmq2845ESRs+FTorwzcp8Y +aNx0RkBLNOIYhgCPJRwmRJi8ax8XDyhfD2CfxP5ep+izhmGDEicSNS91AFGfBpT+Ueh1wulb8V Ly0GzLIVr0v/Ib2uW5e+faB9DgT7EJA5TMldgI2f87qCd7Jdwkx546eNhSq+FB0mNdUdMsd37Pa dYJY7MMTq3RdmL2eZPTllcLgEpt3qIOoSj7E1h7uibc62mSJq3qClxlPTYedyeiDvRpZXb6ST38 g56hJ83AAhvDQgqNA8t2IhWVxE1H55WWMOLl/xM+r1LooF33OfQnK/8LDo8by8U2cJdujypYk+d 8miVCmmNt97Z+4q9PVafQ0HsyUj1QxU6FBT9jwpJ3I41b3IAZ+z6tGA0b7lYRFZzDBad3Lw== X-Received: by 2002:ac8:5d43:0:b0:517:7d9a:a88 with SMTP id d75a77b69052e-517ee213f9bmr804651cf.37.1781127720426; Wed, 10 Jun 2026 14:42:00 -0700 (PDT) X-Received: by 2002:ac8:5d43:0:b0:517:7d9a:a88 with SMTP id d75a77b69052e-517ee213f9bmr803081cf.37.1781127718990; Wed, 10 Jun 2026 14:41:58 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, andrew.jones@oss.qualcomm.com, leif.lindholm@oss.qualcomm.com, uwu@icenowy.me, Fei Wu , Daniel Henrique Barboza , Paolo Bonzini , Palmer Dabbelt Subject: [PATCH v8 3/7] hw/riscv: server platform reference machine Date: Wed, 10 Jun 2026 18:41:29 -0300 Message-ID: <20260610214133.1882563-4-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> References: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: smHH2DIoZoWAMg6azo5zB4hxEsZwlBx5 X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX/L+ovUXBe9S4 a54ZbEWC3i9KWuoHA/Czt4lKNVyyNhqd3xgF4cJ1q9LMEg8qrlD1eBeuVn9/n8iX9qKZMglB0qU Z0DfXN5b3O4pA2vqFJhmEyeXRXyI+S8= X-Proofpoint-ORIG-GUID: smHH2DIoZoWAMg6azo5zB4hxEsZwlBx5 X-Authority-Analysis: v=2.4 cv=Kux9H2WN c=1 sm=1 tr=0 ts=6a29da29 cx=c_pps a=WeENfcodrlLV9YRTxbY/uA==:117 a=gdiugJE53z4H+vvYeRBHqw==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=NEAV23lmAAAA:8 a=uTRCLKPYAAAA:8 a=EUspDBNiAAAA:8 a=uK5kh-ozGs8iDS-x-6cA:9 a=DRYXvJFRnqj4ETZq:21 a=kacYvNCVWA4VmyqE58fU:22 a=T-agBWn15iSmxapsA1lH:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX325lsv8oA17Q 9jWBqf3DK8aYxShC3jGsxQXFcOlcTGb28nFQfe1yKkRxOrkwNPsbbCgRh02lsUN0MvVusNx4GUV 3F9jk3OyQ+jUQc9cLdE1nljDWkI8+rlnuhm51+dAzb4PN1c+FY1E40WdxfRC4+Z8dkB+M+lxhJK eAAn0iMrI9uz2eNfRH49C6y8jZqOLV1HAhixH2wBPvJSICAizqL3y92Um9USqKqPwahIBcCWwYn dPD2hI2mN0hDORTsDoysbCgU19bmz/7RSTUIM9AEsIPN+V5wib8Cp5ix6H9UecSXrY0t7V27z7f yRS92rDsQQsu5BXF9Jkd6rJ4YRTI0adZpyuzSCy338ZOpnTZ6Oo2euKNKASon9VSg6+rsNF25Zn KuL651VGzfbiq8YAxgAGqj6ZXMtWqqT4stTRGA/piS1dShMT9tBFA251r+GqGcEJrV0scBon9NF rQyf8bKtQ8HTKcj6j+Q== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-10_04,2026-06-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 malwarescore=0 phishscore=0 spamscore=0 bulkscore=0 clxscore=1015 suspectscore=0 lowpriorityscore=0 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606100207 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=daniel.barboza@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: 1781127767552154100 Content-Type: text/plain; charset="utf-8" From: Fei Wu The RISC-V Server Platform specification [1] defines a standardized set of hardware and software capabilities, that portable system software, such as OS and hypervisors can rely on being present in a RISC-V server platform. The main features included in this emulation are: - Based on riscv virt machine type; - A new memory map as close as virt machine as possible; - An always present IOMMU platform device (riscv-iommu-sys) that uses IRQs 36 to 39, one IRQ for queue, similar to the 'virt' board; - AIA; - PCIe AHCI; - PCIe NIC; - No virtio device; - No fw_cfg device; - No ACPI table provided; - Only minimal device tree nodes. [1] https://github.com/riscv-non-isa/riscv-server-platform Signed-off-by: Fei Wu Signed-off-by: Daniel Henrique Barboza Reviewed-by: Nutty Liu --- configs/devices/riscv64-softmmu/default.mak | 1 + hw/riscv/Kconfig | 15 + hw/riscv/meson.build | 1 + hw/riscv/server_platform_ref.c | 1389 +++++++++++++++++++ 4 files changed, 1406 insertions(+) create mode 100644 hw/riscv/server_platform_ref.c diff --git a/configs/devices/riscv64-softmmu/default.mak b/configs/devices/= riscv64-softmmu/default.mak index a8e4d0ab33..ae3f62e2d4 100644 --- a/configs/devices/riscv64-softmmu/default.mak +++ b/configs/devices/riscv64-softmmu/default.mak @@ -9,6 +9,7 @@ # CONFIG_SIFIVE_E=3Dn # CONFIG_SIFIVE_U=3Dn # CONFIG_RISCV_VIRT=3Dn +# CONFIG_RISCV_SERVER_PLATFORM_REF=3Dn # CONFIG_MICROCHIP_PFSOC=3Dn # CONFIG_SHAKTI_C=3Dn # CONFIG_XIANGSHAN_KUNMINGHU=3Dn diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 2518b04175..1807c423ff 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -69,6 +69,21 @@ config RISCV_VIRT select ACPI select ACPI_PCI =20 +config RISCV_SERVER_PLATFORM_REF + bool + default y + depends on RISCV64 + select RISCV_NUMA + select GOLDFISH_RTC + select PCI + select PCI_EXPRESS_GENERIC_BRIDGE + select PFLASH_CFI01 + select SERIAL + select RISCV_ACLINT + select RISCV_APLIC + select RISCV_IMSIC + select RISCV_IOMMU + config SHAKTI_C bool default y diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 533472e22a..74944cca84 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -4,6 +4,7 @@ riscv_ss.add(when: 'CONFIG_RISCV_NUMA', if_true: files('num= a.c')) riscv_ss.add(files('riscv_hart.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_RISCV_SERVER_PLATFORM_REF', if_true: files('ser= ver_platform_ref.c')) riscv_ss.add(when: 'CONFIG_SHAKTI_C', if_true: files('shakti_c.c')) riscv_ss.add(when: 'CONFIG_SIFIVE_E', if_true: files('sifive_e.c')) riscv_ss.add(when: 'CONFIG_SIFIVE_U', if_true: files('sifive_u.c')) diff --git a/hw/riscv/server_platform_ref.c b/hw/riscv/server_platform_ref.c new file mode 100644 index 0000000000..7e626c6eb7 --- /dev/null +++ b/hw/riscv/server_platform_ref.c @@ -0,0 +1,1389 @@ +/* + * QEMU RISC-V Server Platform Reference Board (riscv-server-ref) + * + * Copyright (c) 2024 Intel, Inc. + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" +#include "qemu/error-report.h" +#include "qemu/guest-random.h" +#include "qapi/error.h" +#include "qapi/qapi-visit-common.h" +#include "hw/core/boards.h" +#include "hw/core/loader.h" +#include "hw/core/sysbus.h" +#include "hw/core/qdev-properties.h" +#include "hw/char/serial.h" +#include "hw/block/flash.h" +#include "hw/ide/pci.h" +#include "hw/ide/ahci-pci.h" +#include "hw/pci/pci.h" +#include "hw/pci-host/gpex.h" +#include "hw/core/sysbus-fdt.h" +#include "hw/riscv/riscv_hart.h" +#include "hw/riscv/boot.h" +#include "hw/riscv/machines-qom.h" +#include "hw/riscv/numa.h" +#include "hw/riscv/iommu.h" +#include "hw/riscv/riscv-iommu-bits.h" +#include "hw/intc/riscv_aclint.h" +#include "hw/intc/riscv_aplic.h" +#include "hw/intc/riscv_imsic.h" +#include "chardev/char.h" +#include "hw/char/serial-mm.h" +#include "system/device_tree.h" +#include "system/runstate.h" +#include "system/system.h" +#include "system/tcg.h" +#include "system/qtest.h" +#include "target/riscv/cpu.h" +#include "target/riscv/pmu.h" +#include "net/net.h" + +#define RVSERVER_CPUS_MAX_BITS 9 +#define RVSERVER_CPUS_MAX (1 << RVSERVER_CPUS_MAX_BITS) +#define RVSERVER_SOCKETS_MAX_BITS 2 +#define RVSERVER_SOCKETS_MAX (1 << RVSERVER_SOCKETS_MAX_BITS) + +#define RVSERVER_IRQCHIP_NUM_MSIS 255 +#define RVSERVER_IRQCHIP_NUM_SOURCES 96 +#define RVSERVER_IRQCHIP_NUM_PRIO_BITS 3 +#define RVSERVER_IRQCHIP_MAX_GUESTS_BITS 3 +#define RVSERVER_IRQCHIP_MAX_GUESTS \ + ((1U << RVSERVER_IRQCHIP_MAX_GUESTS_BITS) - 1U) + +#define FDT_PCI_ADDR_CELLS 3 +#define FDT_PCI_INT_CELLS 1 +#define FDT_APLIC_INT_CELLS 2 +#define FDT_APLIC_ADDR_CELLS 0 +#define FDT_IMSIC_INT_CELLS 0 +#define FDT_MAX_INT_CELLS 2 +#define FDT_MAX_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \ + 1 + FDT_MAX_INT_CELLS) +#define FDT_APLIC_INT_MAP_WIDTH (FDT_PCI_ADDR_CELLS + FDT_PCI_INT_CELLS + \ + 1 + FDT_APLIC_INT_CELLS) + +#define NUM_SATA_PORTS 6 + +#define SYSCON_RESET 0x1 +#define SYSCON_POWEROFF 0x2 + +#define TYPE_RISCV_SERVER_REF_MACHINE MACHINE_TYPE_NAME("riscv-server-ref") +OBJECT_DECLARE_SIMPLE_TYPE(RISCVServerRefMachineState, RISCV_SERVER_REF_MA= CHINE) + +struct RISCVServerRefMachineState { + /*< private >*/ + MachineState parent; + + /*< public >*/ + Notifier machine_done; + RISCVHartArrayState soc[RVSERVER_SOCKETS_MAX]; + DeviceState *irqchip[RVSERVER_SOCKETS_MAX]; + PFlashCFI01 *flash[2]; + + int fdt_size; + int aia_guests; + const MemMapEntry *memmap; +}; + +enum { + RVSERVER_DEBUG, + RVSERVER_MROM, + RVSERVER_RESET_SYSCON, + RVSERVER_RTC, + RVSERVER_IOMMU_SYS, + RVSERVER_ACLINT, + RVSERVER_APLIC_M, + RVSERVER_APLIC_S, + RVSERVER_UART0, + RVSERVER_IMSIC_M, + RVSERVER_IMSIC_S, + RVSERVER_FLASH, + RVSERVER_DRAM, + RVSERVER_PCIE_MMIO, + RVSERVER_PCIE_PIO, + RVSERVER_PCIE_ECAM, + RVSERVER_PCIE_MMIO_HIGH +}; + +enum { + RVSERVER_UART0_IRQ =3D 10, + RVSERVER_RTC_IRQ =3D 11, + RVSERVER_PCIE_IRQ =3D 0x20, /* 32 to 35 */ + IOMMU_SYS_IRQ =3D 0x24 /* 36 to 39 */ +}; + +/* + * The server soc reference machine physical address space used by some of= the + * devices namely ACLINT, APLIC and IMSIC depend on number of Sockets, num= ber + * of CPUs, and number of IMSIC guest files. + * + * Various limits defined by RVSERVER_SOCKETS_MAX_BITS, RVSERVER_CPUS_MAX_= BITS, + * and RVSERVER_IRQCHIP_MAX_GUESTS_BITS are tuned for maximum utilization = of + * server reference machine physical address space. + */ + +#define RVSERVER_IMSIC_GROUP_MAX_SIZE (1U << IMSIC_MMIO_GROUP_MIN_SHI= FT) +#if RVSERVER_IMSIC_GROUP_MAX_SIZE < \ + IMSIC_GROUP_SIZE(RVSERVER_CPUS_MAX_BITS, RVSERVER_IRQCHIP_MAX_GUESTS_B= ITS) +#error "Can't accomodate single IMSIC group in address space" +#endif + +#define RVSERVER_IMSIC_MAX_SIZE (RVSERVER_SOCKETS_MAX * \ + RVSERVER_IMSIC_GROUP_MAX_SIZE) +#if 0x4000000 < RVSERVER_IMSIC_MAX_SIZE +#error "Can't accomodate all IMSIC groups in address space" +#endif + +static const MemMapEntry rvserver_ref_memmap[] =3D { + [RVSERVER_DEBUG] =3D { 0x0, 0x100 }, + [RVSERVER_MROM] =3D { 0x1000, 0xf000 }, + [RVSERVER_RESET_SYSCON] =3D { 0x100000, 0x1000 }, + [RVSERVER_RTC] =3D { 0x101000, 0x1000 }, + [RVSERVER_IOMMU_SYS] =3D { 0x102000, 0x1000 }, + [RVSERVER_ACLINT] =3D { 0x2000000, 0x10000 }, + [RVSERVER_PCIE_PIO] =3D { 0x3000000, 0x10000 }, + [RVSERVER_APLIC_M] =3D { 0xc000000, APLIC_SIZE(RVSERVER_CPUS_M= AX) }, + [RVSERVER_APLIC_S] =3D { 0xd000000, APLIC_SIZE(RVSERVER_CPUS_M= AX) }, + [RVSERVER_UART0] =3D { 0x10000000, 0x100 }, + [RVSERVER_FLASH] =3D { 0x20000000, 0x4000000 }, + [RVSERVER_IMSIC_M] =3D { 0x24000000, RVSERVER_IMSIC_MAX_SIZE }, + [RVSERVER_IMSIC_S] =3D { 0x28000000, RVSERVER_IMSIC_MAX_SIZE }, + [RVSERVER_PCIE_ECAM] =3D { 0x30000000, 0x10000000 }, + [RVSERVER_PCIE_MMIO] =3D { 0x40000000, 0x40000000 }, + [RVSERVER_DRAM] =3D { 0x80000000, 0xff80000000ull }, + [RVSERVER_PCIE_MMIO_HIGH] =3D { 0x10000000000ull, 0x10000000000ull }, +}; + +#define RVSERVER_FLASH_SECTOR_SIZE (256 * KiB) + +static PFlashCFI01 *rvserver_flash_create(RISCVServerRefMachineState *s, + const char *name, + const char *alias_prop_name) +{ + /* + * Create a single flash device. We use the same parameters as + * the flash devices on the ARM virt board. + */ + DeviceState *dev =3D qdev_new(TYPE_PFLASH_CFI01); + + qdev_prop_set_uint64(dev, "sector-length", RVSERVER_FLASH_SECTOR_SIZE); + qdev_prop_set_uint8(dev, "width", 4); + qdev_prop_set_uint8(dev, "device-width", 2); + qdev_prop_set_bit(dev, "big-endian", false); + qdev_prop_set_uint16(dev, "id0", 0x89); + qdev_prop_set_uint16(dev, "id1", 0x18); + qdev_prop_set_uint16(dev, "id2", 0x00); + qdev_prop_set_uint16(dev, "id3", 0x00); + qdev_prop_set_string(dev, "name", name); + + object_property_add_child(OBJECT(s), name, OBJECT(dev)); + object_property_add_alias(OBJECT(s), alias_prop_name, + OBJECT(dev), "drive"); + + return PFLASH_CFI01(dev); +} + +static void rvserver_flash_map(PFlashCFI01 *flash, + hwaddr base, hwaddr size, + MemoryRegion *sysmem) +{ + DeviceState *dev =3D DEVICE(flash); + + assert(QEMU_IS_ALIGNED(size, RVSERVER_FLASH_SECTOR_SIZE)); + assert(size / RVSERVER_FLASH_SECTOR_SIZE <=3D UINT32_MAX); + qdev_prop_set_uint32(dev, "num-blocks", size / RVSERVER_FLASH_SECTOR_S= IZE); + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + + memory_region_add_subregion(sysmem, base, + sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), + 0)); +} + +static void rvserver_flash_maps(RISCVServerRefMachineState *s, + MemoryRegion *sysmem) +{ + hwaddr flashsize =3D rvserver_ref_memmap[RVSERVER_FLASH].size / 2; + hwaddr flashbase =3D rvserver_ref_memmap[RVSERVER_FLASH].base; + + rvserver_flash_map(s->flash[0], flashbase, flashsize, sysmem); + rvserver_flash_map(s->flash[1], flashbase + flashsize, flashsize, sysm= em); +} + +static void create_pcie_irq_map(RISCVServerRefMachineState *s, + void *fdt, char *nodename, + uint32_t irqchip_phandle) +{ + int pin, dev; + uint32_t irq_map_stride =3D 0; + uint32_t full_irq_map[PCI_NUM_PINS * PCI_NUM_PINS * + FDT_MAX_INT_MAP_WIDTH] =3D {}; + uint32_t *irq_map =3D full_irq_map; + + /* + * This code creates a standard swizzle of interrupts such that + * each device's first interrupt is based on it's PCI_SLOT number. + * (See pci_swizzle_map_irq_fn()) + * + * We only need one entry per interrupt in the table (not one per + * possible slot) seeing the interrupt-map-mask will allow the table + * to wrap to any number of devices. + */ + for (dev =3D 0; dev < PCI_NUM_PINS; dev++) { + int devfn =3D dev * 0x8; + + for (pin =3D 0; pin < PCI_NUM_PINS; pin++) { + int irq_nr =3D RVSERVER_PCIE_IRQ + + ((pin + PCI_SLOT(devfn)) % PCI_NUM_PINS); + int i =3D 0; + + /* Fill PCI address cells */ + irq_map[i] =3D cpu_to_be32(devfn << 8); + i +=3D FDT_PCI_ADDR_CELLS; + + /* Fill PCI Interrupt cells */ + irq_map[i] =3D cpu_to_be32(pin + 1); + i +=3D FDT_PCI_INT_CELLS; + + /* Fill interrupt controller phandle and cells */ + irq_map[i++] =3D cpu_to_be32(irqchip_phandle); + irq_map[i++] =3D cpu_to_be32(irq_nr); + irq_map[i++] =3D cpu_to_be32(0x4); + + if (!irq_map_stride) { + irq_map_stride =3D i; + } + irq_map +=3D irq_map_stride; + } + } + + qemu_fdt_setprop(fdt, nodename, "interrupt-map", full_irq_map, + PCI_NUM_PINS * PCI_NUM_PINS * + irq_map_stride * sizeof(uint32_t)); + + qemu_fdt_setprop_cells(fdt, nodename, "interrupt-map-mask", + 0x1800, 0, 0, 0x7); +} + +static void create_fdt_socket_cpus(RISCVServerRefMachineState *s, int sock= et, + char *clust_name, uint32_t *phandle, + uint32_t *intc_phandles) +{ + int cpu; + uint32_t cpu_phandle; + MachineState *ms =3D MACHINE(s); + bool is_32_bit =3D riscv_is_32bit(&s->soc[0]); + int8_t satp_mode_max; + + for (cpu =3D s->soc[socket].num_harts - 1; cpu >=3D 0; cpu--) { + RISCVCPU *cpu_ptr =3D &s->soc[socket].harts[cpu]; + satp_mode_max =3D cpu_ptr->cfg.max_satp_mode; + g_autofree char *cpu_name =3D NULL; + g_autofree char *core_name =3D NULL; + g_autofree char *intc_name =3D NULL; + g_autofree char *sv_name =3D NULL; + + cpu_phandle =3D (*phandle)++; + + cpu_name =3D g_strdup_printf("/cpus/cpu@%d", + s->soc[socket].hartid_base + cpu); + qemu_fdt_add_subnode(ms->fdt, cpu_name); + + if (satp_mode_max !=3D -1) { + sv_name =3D g_strdup_printf("riscv,%s", + satp_mode_str(satp_mode_max, is_32_b= it)); + qemu_fdt_setprop_string(ms->fdt, cpu_name, "mmu-type", sv_name= ); + } + + riscv_isa_write_fdt(cpu_ptr, ms->fdt, cpu_name); + + if (cpu_ptr->cfg.ext_zicbom) { + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbom-block-siz= e", + cpu_ptr->cfg.cbom_blocksize); + } + + if (cpu_ptr->cfg.ext_zicboz) { + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cboz-block-siz= e", + cpu_ptr->cfg.cboz_blocksize); + } + + if (cpu_ptr->cfg.ext_zicbop) { + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "riscv,cbop-block-siz= e", + cpu_ptr->cfg.cbop_blocksize); + } + + qemu_fdt_setprop_string(ms->fdt, cpu_name, "compatible", "riscv"); + qemu_fdt_setprop_string(ms->fdt, cpu_name, "status", "okay"); + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "reg", + s->soc[socket].hartid_base + cpu); + qemu_fdt_setprop_string(ms->fdt, cpu_name, "device_type", "cpu"); + riscv_socket_fdt_write_id(ms, cpu_name, socket); + qemu_fdt_setprop_cell(ms->fdt, cpu_name, "phandle", cpu_phandle); + + intc_phandles[cpu] =3D (*phandle)++; + + intc_name =3D g_strdup_printf("%s/interrupt-controller", cpu_name); + qemu_fdt_add_subnode(ms->fdt, intc_name); + qemu_fdt_setprop_cell(ms->fdt, intc_name, "phandle", + intc_phandles[cpu]); + qemu_fdt_setprop_string(ms->fdt, intc_name, "compatible", + "riscv,cpu-intc"); + qemu_fdt_setprop(ms->fdt, intc_name, "interrupt-controller", NULL,= 0); + qemu_fdt_setprop_cell(ms->fdt, intc_name, "#interrupt-cells", 1); + + core_name =3D g_strdup_printf("%s/core%d", clust_name, cpu); + qemu_fdt_add_subnode(ms->fdt, core_name); + qemu_fdt_setprop_cell(ms->fdt, core_name, "cpu", cpu_phandle); + } +} + +static void create_fdt_socket_memory(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, int socket) +{ + g_autofree char *mem_name =3D NULL; + hwaddr addr, size; + MachineState *ms =3D MACHINE(s); + + addr =3D memmap[RVSERVER_DRAM].base + riscv_socket_mem_offset(ms, sock= et); + size =3D riscv_socket_mem_size(ms, socket); + mem_name =3D g_strdup_printf("/memory@%"HWADDR_PRIx, addr); + qemu_fdt_add_subnode(ms->fdt, mem_name); + qemu_fdt_setprop_cells(ms->fdt, mem_name, "reg", + addr >> 32, addr, size >> 32, size); + qemu_fdt_setprop_string(ms->fdt, mem_name, "device_type", "memory"); + riscv_socket_fdt_write_id(ms, mem_name, socket); +} + +static void create_fdt_socket_aclint(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, int socket, + uint32_t *intc_phandles) +{ + int cpu; + g_autofree char *name =3D NULL; + hwaddr addr, size; + uint32_t aclint_cells_size; + g_autofree uint32_t *aclint_mtimer_cells =3D NULL; + MachineState *ms =3D MACHINE(s); + + aclint_mtimer_cells =3D g_new0(uint32_t, s->soc[socket].num_harts * 2); + + for (cpu =3D 0; cpu < s->soc[socket].num_harts; cpu++) { + aclint_mtimer_cells[cpu * 2 + 0] =3D cpu_to_be32(intc_phandles[cpu= ]); + aclint_mtimer_cells[cpu * 2 + 1] =3D cpu_to_be32(IRQ_M_TIMER); + } + aclint_cells_size =3D s->soc[socket].num_harts * sizeof(uint32_t) * 2; + + addr =3D memmap[RVSERVER_ACLINT].base + + RISCV_ACLINT_DEFAULT_MTIMER_SIZE * socket; + size =3D RISCV_ACLINT_DEFAULT_MTIMER_SIZE; + + name =3D g_strdup_printf("/soc/mtimer@%"HWADDR_PRIx, addr); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", + "riscv,aclint-mtimer"); + qemu_fdt_setprop_cells(ms->fdt, name, "reg", + 0x0, addr + RISCV_ACLINT_DEFAULT_MTIME, + 0x0, size - RISCV_ACLINT_DEFAULT_MTIME, + 0x0, addr + RISCV_ACLINT_DEFAULT_MTIMECMP, + 0x0, RISCV_ACLINT_DEFAULT_MTIME); + qemu_fdt_setprop(ms->fdt, name, "interrupts-extended", + aclint_mtimer_cells, aclint_cells_size); + riscv_socket_fdt_write_id(ms, name, socket); +} + +static uint32_t imsic_num_bits(uint32_t count) +{ + uint32_t ret =3D 0; + + while (BIT(ret) < count) { + ret++; + } + + return ret; +} + +static void create_fdt_one_imsic(RISCVServerRefMachineState *s, + hwaddr base_addr, + uint32_t *intc_phandles, + uint32_t msi_phandle, + bool m_mode, uint32_t imsic_guest_bits) +{ + int cpu, socket; + g_autofree char *imsic_name =3D NULL; + MachineState *ms =3D MACHINE(s); + int socket_count =3D riscv_socket_count(ms); + uint32_t imsic_max_hart_per_socket, imsic_addr, imsic_size; + g_autofree uint32_t *imsic_cells =3D NULL; + g_autofree uint32_t *imsic_regs =3D NULL; + static const char * const imsic_compat[2] =3D { + "qemu,imsics", "riscv,imsics" + }; + + imsic_cells =3D g_new0(uint32_t, ms->smp.cpus * 2); + imsic_regs =3D g_new0(uint32_t, socket_count * 4); + + for (cpu =3D 0; cpu < ms->smp.cpus; cpu++) { + imsic_cells[cpu * 2 + 0] =3D cpu_to_be32(intc_phandles[cpu]); + imsic_cells[cpu * 2 + 1] =3D cpu_to_be32(m_mode ? IRQ_M_EXT : IRQ_= S_EXT); + } + + imsic_max_hart_per_socket =3D 0; + for (socket =3D 0; socket < socket_count; socket++) { + imsic_addr =3D base_addr + socket * RVSERVER_IMSIC_GROUP_MAX_SIZE; + imsic_size =3D IMSIC_HART_SIZE(imsic_guest_bits) * + s->soc[socket].num_harts; + imsic_regs[socket * 4 + 0] =3D 0; + imsic_regs[socket * 4 + 1] =3D cpu_to_be32(imsic_addr); + imsic_regs[socket * 4 + 2] =3D 0; + imsic_regs[socket * 4 + 3] =3D cpu_to_be32(imsic_size); + if (imsic_max_hart_per_socket < s->soc[socket].num_harts) { + imsic_max_hart_per_socket =3D s->soc[socket].num_harts; + } + } + + imsic_name =3D g_strdup_printf("/soc/interrupt-controller@%lx", + (unsigned long)base_addr); + qemu_fdt_add_subnode(ms->fdt, imsic_name); + qemu_fdt_setprop_string_array(ms->fdt, imsic_name, "compatible", + (char **)&imsic_compat, + ARRAY_SIZE(imsic_compat)); + + qemu_fdt_setprop_cell(ms->fdt, imsic_name, "#interrupt-cells", + FDT_IMSIC_INT_CELLS); + qemu_fdt_setprop(ms->fdt, imsic_name, "interrupt-controller", NULL, 0); + qemu_fdt_setprop(ms->fdt, imsic_name, "msi-controller", NULL, 0); + qemu_fdt_setprop(ms->fdt, imsic_name, "interrupts-extended", + imsic_cells, ms->smp.cpus * sizeof(uint32_t) * 2); + qemu_fdt_setprop(ms->fdt, imsic_name, "reg", imsic_regs, + socket_count * sizeof(uint32_t) * 4); + qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,num-ids", + RVSERVER_IRQCHIP_NUM_MSIS); + + if (imsic_guest_bits) { + qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,guest-index-bits= ", + imsic_guest_bits); + } + + if (socket_count > 1) { + qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,hart-index-bits", + imsic_num_bits(imsic_max_hart_per_socket)); + qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-bits= ", + imsic_num_bits(socket_count)); + qemu_fdt_setprop_cell(ms->fdt, imsic_name, "riscv,group-index-shif= t", + IMSIC_MMIO_GROUP_MIN_SHIFT); + } + qemu_fdt_setprop_cell(ms->fdt, imsic_name, "phandle", msi_phandle); +} + +static void create_fdt_imsic(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, + uint32_t *phandle, uint32_t *intc_phandles, + uint32_t *msi_m_phandle, uint32_t *msi_s_phan= dle) +{ + *msi_m_phandle =3D (*phandle)++; + *msi_s_phandle =3D (*phandle)++; + + /* M-level IMSIC node */ + create_fdt_one_imsic(s, memmap[RVSERVER_IMSIC_M].base, intc_phandles, + *msi_m_phandle, true, 0); + + /* S-level IMSIC node */ + create_fdt_one_imsic(s, memmap[RVSERVER_IMSIC_S].base, intc_phandles, + *msi_s_phandle, false, + imsic_num_bits(s->aia_guests + 1)); + +} + +/* Caller must free string after use. Copied from hw/riscv/virt.c. */ +static char *fdt_get_aplic_nodename(unsigned long aplic_addr) +{ + return g_strdup_printf("/soc/interrupt-controller@%lx", aplic_addr); +} + +static void create_fdt_one_aplic(RISCVServerRefMachineState *s, int socket, + unsigned long aplic_addr, uint32_t aplic_= size, + uint32_t msi_phandle, + uint32_t *intc_phandles, + uint32_t aplic_phandle, + uint32_t aplic_child_phandle, + bool m_mode, int num_harts) +{ + int cpu; + g_autofree char *aplic_name =3D fdt_get_aplic_nodename(aplic_addr); + g_autofree uint32_t *aplic_cells =3D g_new0(uint32_t, num_harts * 2); + MachineState *ms =3D MACHINE(s); + static const char * const aplic_compat[2] =3D { + "qemu,aplic", "riscv,aplic" + }; + + for (cpu =3D 0; cpu < num_harts; cpu++) { + aplic_cells[cpu * 2 + 0] =3D cpu_to_be32(intc_phandles[cpu]); + aplic_cells[cpu * 2 + 1] =3D cpu_to_be32(m_mode ? IRQ_M_EXT : IRQ_= S_EXT); + } + + qemu_fdt_add_subnode(ms->fdt, aplic_name); + qemu_fdt_setprop_string_array(ms->fdt, aplic_name, "compatible", + (char **)&aplic_compat, + ARRAY_SIZE(aplic_compat)); + qemu_fdt_setprop_cell(ms->fdt, aplic_name, "#address-cells", + FDT_APLIC_ADDR_CELLS); + qemu_fdt_setprop_cell(ms->fdt, aplic_name, + "#interrupt-cells", FDT_APLIC_INT_CELLS); + qemu_fdt_setprop(ms->fdt, aplic_name, "interrupt-controller", NULL, 0); + + qemu_fdt_setprop_cell(ms->fdt, aplic_name, "msi-parent", msi_phandle); + + qemu_fdt_setprop_cells(ms->fdt, aplic_name, "reg", + 0x0, aplic_addr, 0x0, aplic_size); + qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,num-sources", + RVSERVER_IRQCHIP_NUM_SOURCES); + + if (aplic_child_phandle) { + qemu_fdt_setprop_cell(ms->fdt, aplic_name, "riscv,children", + aplic_child_phandle); + qemu_fdt_setprop_cells(ms->fdt, aplic_name, "riscv,delegate", + aplic_child_phandle, 0x1, + RVSERVER_IRQCHIP_NUM_SOURCES); + } + + riscv_socket_fdt_write_id(ms, aplic_name, socket); + qemu_fdt_setprop_cell(ms->fdt, aplic_name, "phandle", aplic_phandle); +} + +static void create_fdt_socket_aplic(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, int socket, + uint32_t msi_m_phandle, + uint32_t msi_s_phandle, + uint32_t *phandle, + uint32_t *intc_phandles, + uint32_t *aplic_phandles, + int num_harts) +{ + unsigned long aplic_addr; + uint32_t aplic_m_phandle, aplic_s_phandle; + + aplic_m_phandle =3D (*phandle)++; + aplic_s_phandle =3D (*phandle)++; + + /* M-level APLIC node */ + aplic_addr =3D memmap[RVSERVER_APLIC_M].base + + memmap[RVSERVER_APLIC_M].size * socket; + create_fdt_one_aplic(s, socket, aplic_addr, memmap[RVSERVER_APLIC_M].s= ize, + msi_m_phandle, intc_phandles, + aplic_m_phandle, aplic_s_phandle, + true, num_harts); + + /* S-level APLIC node */ + aplic_addr =3D memmap[RVSERVER_APLIC_S].base + + memmap[RVSERVER_APLIC_S].size * socket; + create_fdt_one_aplic(s, socket, aplic_addr, memmap[RVSERVER_APLIC_S].s= ize, + msi_s_phandle, intc_phandles, + aplic_s_phandle, 0, + false, num_harts); + + aplic_phandles[socket] =3D aplic_s_phandle; +} + +static void create_fdt_pmu(RISCVServerRefMachineState *s) +{ + g_autofree char *pmu_name =3D g_strdup_printf("/pmu"); + MachineState *ms =3D MACHINE(s); + RISCVCPU *hart =3D &s->soc[0].harts[0]; + + qemu_fdt_add_subnode(ms->fdt, pmu_name); + qemu_fdt_setprop_string(ms->fdt, pmu_name, "compatible", "riscv,pmu"); + riscv_pmu_generate_fdt_node(ms->fdt, hart->pmu_avail_ctrs, pmu_name); +} + +static void create_fdt_sockets(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, + uint32_t *phandle, + uint32_t *irq_mmio_phandle, + uint32_t *irq_pcie_phandle, + uint32_t *msi_pcie_phandle) +{ + int socket, phandle_pos; + MachineState *ms =3D MACHINE(s); + uint32_t msi_m_phandle =3D 0, msi_s_phandle =3D 0; + uint32_t xplic_phandles[MAX_NODES]; + g_autofree uint32_t *intc_phandles =3D NULL; + int socket_count =3D riscv_socket_count(ms); + + qemu_fdt_add_subnode(ms->fdt, "/cpus"); + qemu_fdt_setprop_cell(ms->fdt, "/cpus", "timebase-frequency", + RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ); + qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#size-cells", 0x0); + qemu_fdt_setprop_cell(ms->fdt, "/cpus", "#address-cells", 0x1); + qemu_fdt_add_subnode(ms->fdt, "/cpus/cpu-map"); + + intc_phandles =3D g_new0(uint32_t, ms->smp.cpus); + + phandle_pos =3D ms->smp.cpus; + for (socket =3D (socket_count - 1); socket >=3D 0; socket--) { + g_autofree char *clust_name =3D NULL; + phandle_pos -=3D s->soc[socket].num_harts; + + clust_name =3D g_strdup_printf("/cpus/cpu-map/cluster%d", socket); + qemu_fdt_add_subnode(ms->fdt, clust_name); + + create_fdt_socket_cpus(s, socket, clust_name, phandle, + &intc_phandles[phandle_pos]); + + create_fdt_socket_memory(s, memmap, socket); + + create_fdt_socket_aclint(s, memmap, socket, + &intc_phandles[phandle_pos]); + } + + create_fdt_imsic(s, memmap, phandle, intc_phandles, + &msi_m_phandle, &msi_s_phandle); + *msi_pcie_phandle =3D msi_s_phandle; + + phandle_pos =3D ms->smp.cpus; + for (socket =3D (socket_count - 1); socket >=3D 0; socket--) { + phandle_pos -=3D s->soc[socket].num_harts; + + create_fdt_socket_aplic(s, memmap, socket, + msi_m_phandle, msi_s_phandle, phandle, + &intc_phandles[phandle_pos], + xplic_phandles, + s->soc[socket].num_harts); + } + + for (socket =3D 0; socket < socket_count; socket++) { + if (socket =3D=3D 0) { + *irq_mmio_phandle =3D xplic_phandles[socket]; + *irq_pcie_phandle =3D xplic_phandles[socket]; + } + if (socket =3D=3D 1) { + *irq_pcie_phandle =3D xplic_phandles[socket]; + } + } + + riscv_socket_fdt_write_distance_matrix(ms); +} + +static void create_fdt_iommu_sys(RISCVServerRefMachineState *s, + uint32_t irq_chip, + uint32_t msi_phandle, + uint32_t *iommu_sys_phandle) +{ + const char comp[] =3D "riscv,iommu"; + void *fdt =3D MACHINE(s)->fdt; + uint32_t iommu_phandle; + g_autofree char *iommu_node =3D NULL; + hwaddr addr =3D s->memmap[RVSERVER_IOMMU_SYS].base; + hwaddr size =3D s->memmap[RVSERVER_IOMMU_SYS].size; + uint32_t iommu_irq_map[RISCV_IOMMU_INTR_COUNT] =3D { + IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_CQ, + IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_FQ, + IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_PM, + IOMMU_SYS_IRQ + RISCV_IOMMU_INTR_PQ, + }; + + iommu_node =3D g_strdup_printf("/soc/iommu@%"HWADDR_PRIx, + s->memmap[RVSERVER_IOMMU_SYS].base); + iommu_phandle =3D qemu_fdt_alloc_phandle(fdt); + qemu_fdt_add_subnode(fdt, iommu_node); + + qemu_fdt_setprop(fdt, iommu_node, "compatible", comp, sizeof(comp)); + qemu_fdt_setprop_cell(fdt, iommu_node, "#iommu-cells", 1); + qemu_fdt_setprop_cell(fdt, iommu_node, "phandle", iommu_phandle); + + qemu_fdt_setprop_cells(fdt, iommu_node, "reg", + addr >> 32, addr, size >> 32, size); + qemu_fdt_setprop_cell(fdt, iommu_node, "interrupt-parent", irq_chip); + + qemu_fdt_setprop_cells(fdt, iommu_node, "interrupts", + iommu_irq_map[0], FDT_IRQ_TYPE_EDGE_LOW, + iommu_irq_map[1], FDT_IRQ_TYPE_EDGE_LOW, + iommu_irq_map[2], FDT_IRQ_TYPE_EDGE_LOW, + iommu_irq_map[3], FDT_IRQ_TYPE_EDGE_LOW); + + qemu_fdt_setprop_cell(fdt, iommu_node, "msi-parent", msi_phandle); + + *iommu_sys_phandle =3D iommu_phandle; +} + +static void create_fdt_pcie(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, + uint32_t irq_pcie_phandle, + uint32_t msi_pcie_phandle, + uint32_t iommu_sys_phandle) +{ + g_autofree char *name =3D NULL; + MachineState *ms =3D MACHINE(s); + + name =3D g_strdup_printf("/soc/pci@%"HWADDR_PRIx, + memmap[RVSERVER_PCIE_ECAM].base); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_cell(ms->fdt, name, "#address-cells", + FDT_PCI_ADDR_CELLS); + qemu_fdt_setprop_cell(ms->fdt, name, "#interrupt-cells", + FDT_PCI_INT_CELLS); + qemu_fdt_setprop_cell(ms->fdt, name, "#size-cells", 0x2); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", + "pci-host-ecam-generic"); + qemu_fdt_setprop_string(ms->fdt, name, "device_type", "pci"); + qemu_fdt_setprop_cell(ms->fdt, name, "linux,pci-domain", 0); + qemu_fdt_setprop_cells(ms->fdt, name, "bus-range", 0, + memmap[RVSERVER_PCIE_ECAM].size / PCIE_MMCFG_SIZE_MIN - 1); + qemu_fdt_setprop(ms->fdt, name, "dma-coherent", NULL, 0); + qemu_fdt_setprop_cell(ms->fdt, name, "msi-parent", msi_pcie_phandle); + qemu_fdt_setprop_cells(ms->fdt, name, "reg", 0, + memmap[RVSERVER_PCIE_ECAM].base, 0, memmap[RVSERVER_PCIE_ECAM].siz= e); + qemu_fdt_setprop_sized_cells(ms->fdt, name, "ranges", + 1, FDT_PCI_RANGE_IOPORT, 2, 0, + 2, memmap[RVSERVER_PCIE_PIO].base, 2, memmap[RVSERVER_PCIE_PIO].si= ze, + 1, FDT_PCI_RANGE_MMIO, + 2, memmap[RVSERVER_PCIE_MMIO].base, + 2, memmap[RVSERVER_PCIE_MMIO].base, 2, memmap[RVSERVER_PCIE_MMIO].= size, + 1, FDT_PCI_RANGE_MMIO_64BIT, + 2, memmap[RVSERVER_PCIE_MMIO_HIGH].base, + 2, memmap[RVSERVER_PCIE_MMIO_HIGH].base, 2, + memmap[RVSERVER_PCIE_MMIO_HIGH].size); + + create_pcie_irq_map(s, ms->fdt, name, irq_pcie_phandle); + + qemu_fdt_setprop_cells(ms->fdt, name, "iommu-map", + 0, iommu_sys_phandle, 0, 0x10000); +} + +static void create_fdt_reset(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, + uint32_t *phandle) +{ + char *name; + uint32_t test_phandle; + MachineState *ms =3D MACHINE(s); + + test_phandle =3D (*phandle)++; + name =3D g_strdup_printf("/soc/reset_syscon@%"HWADDR_PRIx, + memmap[RVSERVER_RESET_SYSCON].base); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon"); + qemu_fdt_setprop_cells(ms->fdt, name, "reg", + 0x0, memmap[RVSERVER_RESET_SYSCON].base, + 0x0, memmap[RVSERVER_RESET_SYSCON].size); + qemu_fdt_setprop_cell(ms->fdt, name, "phandle", test_phandle); + test_phandle =3D qemu_fdt_get_phandle(ms->fdt, name); + g_free(name); + + name =3D g_strdup_printf("/soc/reboot"); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon-reboot"); + qemu_fdt_setprop_cell(ms->fdt, name, "regmap", test_phandle); + qemu_fdt_setprop_cell(ms->fdt, name, "offset", 0x0); + qemu_fdt_setprop_cell(ms->fdt, name, "value", SYSCON_RESET); + g_free(name); + + name =3D g_strdup_printf("/soc/poweroff"); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", "syscon-poweroff"= ); + qemu_fdt_setprop_cell(ms->fdt, name, "regmap", test_phandle); + qemu_fdt_setprop_cell(ms->fdt, name, "offset", 0x0); + qemu_fdt_setprop_cell(ms->fdt, name, "value", SYSCON_POWEROFF); + g_free(name); +} + +static void create_fdt_uart(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, + uint32_t irq_mmio_phandle) +{ + g_autofree char *name =3D NULL; + MachineState *ms =3D MACHINE(s); + + name =3D g_strdup_printf("/soc/serial@%"HWADDR_PRIx, + memmap[RVSERVER_UART0].base); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", "ns16550a"); + qemu_fdt_setprop_cells(ms->fdt, name, "reg", + 0x0, memmap[RVSERVER_UART0].base, + 0x0, memmap[RVSERVER_UART0].size); + qemu_fdt_setprop_cell(ms->fdt, name, "clock-frequency", 3686400); + qemu_fdt_setprop_cell(ms->fdt, name, "interrupt-parent", + irq_mmio_phandle); + qemu_fdt_setprop_cells(ms->fdt, name, "interrupts", + RVSERVER_UART0_IRQ, 0x4); + + qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", name); +} + +static void create_fdt_rtc(RISCVServerRefMachineState *s, + const MemMapEntry *memmap, + uint32_t irq_mmio_phandle) +{ + g_autofree char *name =3D NULL; + MachineState *ms =3D MACHINE(s); + + name =3D g_strdup_printf("/soc/rtc@%"HWADDR_PRIx, + memmap[RVSERVER_RTC].base); + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", + "google,goldfish-rtc"); + qemu_fdt_setprop_cells(ms->fdt, name, "reg", + 0x0, memmap[RVSERVER_RTC].base, 0x0, memmap[RVSERVER_RTC].size); + qemu_fdt_setprop_cell(ms->fdt, name, "interrupt-parent", + irq_mmio_phandle); + qemu_fdt_setprop_cells(ms->fdt, name, "interrupts", + RVSERVER_RTC_IRQ, 0x4); +} + +static void create_fdt_flash(RISCVServerRefMachineState *s, + const MemMapEntry *memmap) +{ + MachineState *ms =3D MACHINE(s); + hwaddr flashsize =3D rvserver_ref_memmap[RVSERVER_FLASH].size / 2; + hwaddr flashbase =3D rvserver_ref_memmap[RVSERVER_FLASH].base; + g_autofree char *name =3D g_strdup_printf("/flash@%"HWADDR_PRIx, flash= base); + + qemu_fdt_add_subnode(ms->fdt, name); + qemu_fdt_setprop_string(ms->fdt, name, "compatible", "cfi-flash"); + qemu_fdt_setprop_sized_cells(ms->fdt, name, "reg", + 2, flashbase, 2, flashsize, + 2, flashbase + flashsize, 2, flashsize); + qemu_fdt_setprop_cell(ms->fdt, name, "bank-width", 4); +} + +static void finalize_fdt(RISCVServerRefMachineState *s) +{ + uint32_t phandle =3D 1, irq_mmio_phandle =3D 1, msi_pcie_phandle =3D 1; + uint32_t irq_pcie_phandle =3D 1, iommu_sys_phandle; + + create_fdt_sockets(s, rvserver_ref_memmap, &phandle, &irq_mmio_phandle, + &irq_pcie_phandle, &msi_pcie_phandle); + + create_fdt_iommu_sys(s, irq_mmio_phandle, msi_pcie_phandle, + &iommu_sys_phandle); + + create_fdt_pcie(s, rvserver_ref_memmap, irq_pcie_phandle, + msi_pcie_phandle, iommu_sys_phandle); + + create_fdt_reset(s, rvserver_ref_memmap, &phandle); + + create_fdt_uart(s, rvserver_ref_memmap, irq_mmio_phandle); + + create_fdt_rtc(s, rvserver_ref_memmap, irq_mmio_phandle); +} + +static void create_fdt(RISCVServerRefMachineState *s, + const MemMapEntry *memmap) +{ + MachineState *ms =3D MACHINE(s); + uint8_t rng_seed[32]; + + ms->fdt =3D create_device_tree(&s->fdt_size); + if (!ms->fdt) { + error_report("create_device_tree() failed"); + exit(1); + } + + qemu_fdt_setprop_string(ms->fdt, "/", "model", "qemu,riscv-server-ref"= ); + qemu_fdt_setprop_string(ms->fdt, "/", "compatible", "riscv-server-ref"= ); + qemu_fdt_setprop_cell(ms->fdt, "/", "#size-cells", 0x2); + qemu_fdt_setprop_cell(ms->fdt, "/", "#address-cells", 0x2); + + /* + * This versioning scheme is for informing platform fw only. It is nei= ther: + * - A QEMU versioned machine type; a given version of QEMU will emula= te + * a given version of the platform. + * - A reflection of level of server platform support provided. + * + * machine-version-major: updated when changes breaking fw compatibili= ty + * are introduced. + * machine-version-minor: updated when features are added that don't b= reak + * fw compatibility. + * + * It's the same as the scheme in arm sbsa-ref. + */ + qemu_fdt_setprop_cell(ms->fdt, "/", "machine-version-major", 0); + qemu_fdt_setprop_cell(ms->fdt, "/", "machine-version-minor", 0); + + qemu_fdt_add_subnode(ms->fdt, "/soc"); + qemu_fdt_setprop(ms->fdt, "/soc", "ranges", NULL, 0); + qemu_fdt_setprop_string(ms->fdt, "/soc", "compatible", "simple-bus"); + qemu_fdt_setprop_cell(ms->fdt, "/soc", "#size-cells", 0x2); + qemu_fdt_setprop_cell(ms->fdt, "/soc", "#address-cells", 0x2); + + qemu_fdt_add_subnode(ms->fdt, "/chosen"); + + /* Pass seed to RNG */ + qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed)); + qemu_fdt_setprop(ms->fdt, "/chosen", "rng-seed", + rng_seed, sizeof(rng_seed)); + + create_fdt_flash(s, memmap); + create_fdt_pmu(s); + +} + +static inline DeviceState *gpex_pcie_init(MemoryRegion *sys_mem, + DeviceState *irqchip, + RISCVServerRefMachineState *s) +{ + DeviceState *dev; + PCIHostState *pci; + PCIDevice *pdev_ahci; + AHCIPCIState *ich9; + DriveInfo *hd[NUM_SATA_PORTS]; + MemoryRegion *ecam_alias, *ecam_reg; + MemoryRegion *mmio_alias, *high_mmio_alias, *mmio_reg; + hwaddr ecam_base =3D rvserver_ref_memmap[RVSERVER_PCIE_ECAM].base; + hwaddr ecam_size =3D rvserver_ref_memmap[RVSERVER_PCIE_ECAM].size; + hwaddr mmio_base =3D rvserver_ref_memmap[RVSERVER_PCIE_MMIO].base; + hwaddr mmio_size =3D rvserver_ref_memmap[RVSERVER_PCIE_MMIO].size; + hwaddr high_mmio_base =3D rvserver_ref_memmap[RVSERVER_PCIE_MMIO_HIGH]= .base; + hwaddr high_mmio_size =3D rvserver_ref_memmap[RVSERVER_PCIE_MMIO_HIGH]= .size; + hwaddr pio_base =3D rvserver_ref_memmap[RVSERVER_PCIE_PIO].base; + hwaddr pio_size =3D rvserver_ref_memmap[RVSERVER_PCIE_PIO].size; + MachineClass *mc =3D MACHINE_GET_CLASS(s); + qemu_irq irq; + int i; + + dev =3D qdev_new(TYPE_GPEX_HOST); + + object_property_set_uint(OBJECT(GPEX_HOST(dev)), PCI_HOST_ECAM_BASE, + ecam_base, NULL); + object_property_set_int(OBJECT(GPEX_HOST(dev)), PCI_HOST_ECAM_SIZE, + ecam_size, NULL); + object_property_set_uint(OBJECT(GPEX_HOST(dev)), + PCI_HOST_BELOW_4G_MMIO_BASE, + mmio_base, NULL); + object_property_set_int(OBJECT(GPEX_HOST(dev)), + PCI_HOST_BELOW_4G_MMIO_SIZE, + mmio_size, NULL); + object_property_set_uint(OBJECT(GPEX_HOST(dev)), + PCI_HOST_ABOVE_4G_MMIO_BASE, + high_mmio_base, NULL); + object_property_set_int(OBJECT(GPEX_HOST(dev)), + PCI_HOST_ABOVE_4G_MMIO_SIZE, + high_mmio_size, NULL); + object_property_set_uint(OBJECT(GPEX_HOST(dev)), PCI_HOST_PIO_BASE, + pio_base, NULL); + object_property_set_int(OBJECT(GPEX_HOST(dev)), PCI_HOST_PIO_SIZE, + pio_size, NULL); + + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + + ecam_alias =3D g_new0(MemoryRegion, 1); + ecam_reg =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0); + memory_region_init_alias(ecam_alias, OBJECT(dev), "pcie-ecam", + ecam_reg, 0, ecam_size); + memory_region_add_subregion(get_system_memory(), ecam_base, ecam_alias= ); + + mmio_alias =3D g_new0(MemoryRegion, 1); + mmio_reg =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1); + memory_region_init_alias(mmio_alias, OBJECT(dev), "pcie-mmio", + mmio_reg, mmio_base, mmio_size); + memory_region_add_subregion(get_system_memory(), mmio_base, mmio_alias= ); + + /* Map high MMIO space */ + high_mmio_alias =3D g_new0(MemoryRegion, 1); + memory_region_init_alias(high_mmio_alias, OBJECT(dev), "pcie-mmio-high= ", + mmio_reg, high_mmio_base, high_mmio_size); + memory_region_add_subregion(get_system_memory(), high_mmio_base, + high_mmio_alias); + + sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, pio_base); + + for (i =3D 0; i < PCI_NUM_PINS; i++) { + irq =3D qdev_get_gpio_in(irqchip, RVSERVER_PCIE_IRQ + i); + + sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, irq); + gpex_set_irq_num(GPEX_HOST(dev), i, RVSERVER_PCIE_IRQ + i); + } + + pci =3D PCI_HOST_BRIDGE(dev); + pci_init_nic_devices(pci->bus, mc->default_nic); + /* IDE disk setup. */ + pdev_ahci =3D pci_create_simple(pci->bus, -1, TYPE_ICH9_AHCI); + ich9 =3D ICH9_AHCI(pdev_ahci); + g_assert(ARRAY_SIZE(hd) =3D=3D ich9->ahci.ports); + ide_drive_get(hd, ich9->ahci.ports); + ahci_ide_create_devs(&ich9->ahci, hd); + + GPEX_HOST(dev)->gpex_cfg.bus =3D PCI_HOST_BRIDGE(GPEX_HOST(dev))->bus; + return dev; +} + +static DeviceState *rvserver_ref_create_aia(int aia_guests, + const MemMapEntry *memmap, + int socket, + int base_hartid, int hart_coun= t) +{ + int i; + hwaddr addr; + uint32_t guest_bits; + DeviceState *aplic_s =3D NULL; + DeviceState *aplic_m =3D NULL; + bool msimode =3D true; + + /* Per-socket M-level IMSICs */ + addr =3D memmap[RVSERVER_IMSIC_M].base + + socket * RVSERVER_IMSIC_GROUP_MAX_SIZE; + for (i =3D 0; i < hart_count; i++) { + riscv_imsic_create(addr + i * IMSIC_HART_SIZE(0), + base_hartid + i, true, 1, + RVSERVER_IRQCHIP_NUM_MSIS); + } + + /* Per-socket S-level IMSICs */ + guest_bits =3D imsic_num_bits(aia_guests + 1); + addr =3D memmap[RVSERVER_IMSIC_S].base + + socket * RVSERVER_IMSIC_GROUP_MAX_SIZE; + for (i =3D 0; i < hart_count; i++) { + riscv_imsic_create(addr + i * IMSIC_HART_SIZE(guest_bits), + base_hartid + i, false, 1 + aia_guests, + RVSERVER_IRQCHIP_NUM_MSIS); + } + + /* Per-socket M-level APLIC */ + aplic_m =3D riscv_aplic_create(memmap[RVSERVER_APLIC_M].base + + socket * memmap[RVSERVER_APLIC_M].size, + memmap[RVSERVER_APLIC_M].size, + (msimode) ? 0 : base_hartid, + (msimode) ? 0 : hart_count, + RVSERVER_IRQCHIP_NUM_SOURCES, + RVSERVER_IRQCHIP_NUM_PRIO_BITS, + msimode, true, NULL); + + /* Per-socket S-level APLIC */ + aplic_s =3D riscv_aplic_create(memmap[RVSERVER_APLIC_S].base + + socket * memmap[RVSERVER_APLIC_S].size, + memmap[RVSERVER_APLIC_S].size, + (msimode) ? 0 : base_hartid, + (msimode) ? 0 : hart_count, + RVSERVER_IRQCHIP_NUM_SOURCES, + RVSERVER_IRQCHIP_NUM_PRIO_BITS, + msimode, false, aplic_m); + + (void)aplic_s; + return aplic_m; +} + +static uint64_t rvserver_reset_syscon_read(void *opaque, hwaddr addr, + unsigned size) +{ + return 0; +} + +static void rvserver_reset_syscon_write(void *opaque, hwaddr addr, + uint64_t val64, unsigned int size) +{ + switch (val64) { + case SYSCON_POWEROFF: + qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN); + return; + case SYSCON_RESET: + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); + return; + default: + break; + } +} + +static const MemoryRegionOps rvserver_reset_syscon_ops =3D { + .read =3D rvserver_reset_syscon_read, + .write =3D rvserver_reset_syscon_write, + .endianness =3D DEVICE_LITTLE_ENDIAN +}; + +static void rvserver_ref_machine_done(Notifier *notifier, void *data) +{ + RISCVServerRefMachineState *s =3D container_of( + notifier, RISCVServerRefMachineState, machine_done); + const MemMapEntry *memmap =3D rvserver_ref_memmap; + MachineState *machine =3D MACHINE(s); + hwaddr start_addr =3D memmap[RVSERVER_DRAM].base; + target_ulong firmware_end_addr, kernel_start_addr; + const char *firmware_name =3D riscv_default_firmware_name(&s->soc[0]); + uint64_t fdt_load_addr; + uint64_t kernel_entry =3D 0; + BlockBackend *pflash_blk0; + RISCVBootInfo boot_info; + + /* + * An user provided dtb must include everything, including + * dynamic sysbus devices. Our FDT needs to be finalized. + */ + if (machine->dtb =3D=3D NULL) { + finalize_fdt(s); + } + + firmware_end_addr =3D riscv_find_and_load_firmware(machine, firmware_n= ame, + &start_addr, NULL); + + pflash_blk0 =3D pflash_cfi01_get_blk(s->flash[0]); + if (pflash_blk0) { + if (machine->firmware && !strcmp(machine->firmware, "none")) { + /* + * Pflash was supplied but bios is none and not KVM guest, + * let's overwrite the address we jump to after reset to + * the base of the flash. + */ + start_addr =3D rvserver_ref_memmap[RVSERVER_FLASH].base; + } else { + /* + * Pflash was supplied but either KVM guest or bios is not non= e. + * In this case, base of the flash would contain S-mode payloa= d. + */ + riscv_setup_firmware_boot(machine); + kernel_entry =3D rvserver_ref_memmap[RVSERVER_FLASH].base; + } + } + + riscv_boot_info_init(&boot_info, &s->soc[0]); + + if (machine->kernel_filename && !kernel_entry) { + kernel_start_addr =3D riscv_calc_kernel_start_addr(&boot_info, + firmware_end_addr= ); + riscv_load_kernel(machine, &boot_info, kernel_start_addr, true, NU= LL); + kernel_entry =3D boot_info.image_low_addr; + } + + fdt_load_addr =3D riscv_compute_fdt_addr(memmap[RVSERVER_DRAM].base, + memmap[RVSERVER_DRAM].size, + machine, &boot_info); + + riscv_load_fdt(fdt_load_addr, machine->fdt); + + /* load the reset vector */ + riscv_setup_rom_reset_vec(machine, &s->soc[0], start_addr, + rvserver_ref_memmap[RVSERVER_MROM].base, + rvserver_ref_memmap[RVSERVER_MROM].size, + kernel_entry, + fdt_load_addr); + +} + +static bool rvserver_aclint_allowed(void) +{ + return tcg_enabled() || qtest_enabled(); +} + +static void rvserver_ref_machine_init(MachineState *machine) +{ + const MemMapEntry *memmap =3D rvserver_ref_memmap; + RISCVServerRefMachineState *s =3D RISCV_SERVER_REF_MACHINE(machine); + MemoryRegion *system_memory =3D get_system_memory(); + MemoryRegion *mask_rom =3D g_new(MemoryRegion, 1); + MemoryRegion *reset_syscon_io =3D g_new(MemoryRegion, 1); + DeviceState *mmio_irqchip, *pcie_irqchip, *iommu_sys; + int i, base_hartid, hart_count; + int socket_count =3D riscv_socket_count(machine); + + /* Check socket count limit */ + if (RVSERVER_SOCKETS_MAX < socket_count) { + error_report("number of sockets/nodes should be less than %d", + RVSERVER_SOCKETS_MAX); + exit(1); + } + + if (!rvserver_aclint_allowed()) { + error_report("'aclint' is only available with TCG acceleration"); + exit(1); + } + + /* Initialize sockets */ + mmio_irqchip =3D pcie_irqchip =3D NULL; + for (i =3D 0; i < socket_count; i++) { + g_autofree char *soc_name =3D g_strdup_printf("soc%d", i); + + if (!riscv_socket_check_hartids(machine, i)) { + error_report("discontinuous hartids in socket%d", i); + exit(1); + } + + base_hartid =3D riscv_socket_first_hartid(machine, i); + if (base_hartid < 0) { + error_report("can't find hartid base for socket%d", i); + exit(1); + } + + hart_count =3D riscv_socket_hart_count(machine, i); + if (hart_count < 0) { + error_report("can't find hart count for socket%d", i); + exit(1); + } + + object_initialize_child(OBJECT(machine), soc_name, &s->soc[i], + TYPE_RISCV_HART_ARRAY); + object_property_set_str(OBJECT(&s->soc[i]), "cpu-type", + machine->cpu_type, &error_abort); + object_property_set_int(OBJECT(&s->soc[i]), "hartid-base", + base_hartid, &error_abort); + object_property_set_int(OBJECT(&s->soc[i]), "num-harts", + hart_count, &error_abort); + sysbus_realize(SYS_BUS_DEVICE(&s->soc[i]), &error_fatal); + + /* Per-socket ACLINT MTIMER */ + riscv_aclint_mtimer_create(memmap[RVSERVER_ACLINT].base + + i * RISCV_ACLINT_DEFAULT_MTIMER_SIZE, + RISCV_ACLINT_DEFAULT_MTIMER_SIZE, + base_hartid, hart_count, + RISCV_ACLINT_DEFAULT_MTIMECMP, + RISCV_ACLINT_DEFAULT_MTIME, + RISCV_ACLINT_DEFAULT_TIMEBASE_FREQ, true); + + /* Per-socket interrupt controller */ + s->irqchip[i] =3D rvserver_ref_create_aia(s->aia_guests, + memmap, i, base_hartid, + hart_count); + + /* Try to use different IRQCHIP instance based device type */ + if (i =3D=3D 0) { + mmio_irqchip =3D s->irqchip[i]; + pcie_irqchip =3D s->irqchip[i]; + } + if (i =3D=3D 1) { + pcie_irqchip =3D s->irqchip[i]; + } + } + + s->memmap =3D rvserver_ref_memmap; + + /* register system main memory (actual RAM) */ + memory_region_add_subregion(system_memory, memmap[RVSERVER_DRAM].base, + machine->ram); + + /* boot rom */ + memory_region_init_rom(mask_rom, NULL, "riscv_rvserver_ref_board.mrom", + memmap[RVSERVER_MROM].size, &error_fatal); + memory_region_add_subregion(system_memory, memmap[RVSERVER_MROM].base, + mask_rom); + + memory_region_init_io(reset_syscon_io, NULL, &rvserver_reset_syscon_op= s, + NULL, "reset_syscon_io", + memmap[RVSERVER_RESET_SYSCON].size); + memory_region_add_subregion(system_memory, + memmap[RVSERVER_RESET_SYSCON].base, + reset_syscon_io); + + gpex_pcie_init(system_memory, pcie_irqchip, s); + + serial_mm_init(system_memory, memmap[RVSERVER_UART0].base, + 0, qdev_get_gpio_in(mmio_irqchip, RVSERVER_UART0_IRQ), 399193, + serial_hd(0), DEVICE_LITTLE_ENDIAN); + + sysbus_create_simple("goldfish_rtc", memmap[RVSERVER_RTC].base, + qdev_get_gpio_in(mmio_irqchip, RVSERVER_RTC_IRQ)); + + for (i =3D 0; i < ARRAY_SIZE(s->flash); i++) { + /* Map legacy -drive if=3Dpflash to machine properties */ + pflash_cfi01_legacy_drive(s->flash[i], + drive_get(IF_PFLASH, 0, i)); + } + rvserver_flash_maps(s, system_memory); + + /* load/create device tree */ + if (machine->dtb) { + machine->fdt =3D load_device_tree(machine->dtb, &s->fdt_size); + if (!machine->fdt) { + error_report("load_device_tree() failed"); + exit(1); + } + } else { + create_fdt(s, memmap); + } + + iommu_sys =3D qdev_new(TYPE_RISCV_IOMMU_SYS); + object_property_set_uint(OBJECT(iommu_sys), "addr", + s->memmap[RVSERVER_IOMMU_SYS].base, + &error_fatal); + + object_property_set_uint(OBJECT(iommu_sys), "base-irq", + IOMMU_SYS_IRQ, + &error_fatal); + + object_property_set_link(OBJECT(iommu_sys), "irqchip", + OBJECT(mmio_irqchip), + &error_fatal); + + sysbus_realize_and_unref(SYS_BUS_DEVICE(iommu_sys), &error_fatal); + + s->machine_done.notify =3D rvserver_ref_machine_done; + qemu_add_machine_init_done_notifier(&s->machine_done); +} + +static void rvserver_ref_machine_instance_init(Object *obj) +{ + RISCVServerRefMachineState *s =3D RISCV_SERVER_REF_MACHINE(obj); + + s->flash[0] =3D rvserver_flash_create(s, "riscv-server-ref.flash0", + "pflash0"); + s->flash[1] =3D rvserver_flash_create(s, "riscv-server-ref.flash1", + "pflash1"); +} + +static char *rvserver_ref_get_aia_guests(Object *obj, Error **errp) +{ + RISCVServerRefMachineState *s =3D RISCV_SERVER_REF_MACHINE(obj); + char val[32]; + + sprintf(val, "%d", s->aia_guests); + return g_strdup(val); +} + +static void rvserver_ref_set_aia_guests(Object *obj, const char *val, + Error **errp) +{ + RISCVServerRefMachineState *s =3D RISCV_SERVER_REF_MACHINE(obj); + + s->aia_guests =3D atoi(val); + if (s->aia_guests < 0 || s->aia_guests > RVSERVER_IRQCHIP_MAX_GUESTS) { + error_setg(errp, "Invalid number of AIA IMSIC guests"); + error_append_hint(errp, "Valid values be between 0 and %d.\n", + RVSERVER_IRQCHIP_MAX_GUESTS); + } +} + +static void rvserver_ref_machine_class_init(ObjectClass *oc, const void *d= ata) +{ + char str[128]; + MachineClass *mc =3D MACHINE_CLASS(oc); + static const char * const valid_cpu_types[] =3D { + TYPE_RISCV_CPU_RVSERVER_REF, + }; + + mc->desc =3D "RISC-V Server SoC Reference board"; + mc->init =3D rvserver_ref_machine_init; + mc->max_cpus =3D RVSERVER_CPUS_MAX; + mc->default_cpu_type =3D TYPE_RISCV_CPU_RVSERVER_REF; + mc->valid_cpu_types =3D valid_cpu_types; + mc->pci_allow_0_address =3D true; + mc->default_nic =3D "e1000e"; + mc->possible_cpu_arch_ids =3D riscv_numa_possible_cpu_arch_ids; + mc->cpu_index_to_instance_props =3D riscv_numa_cpu_index_to_props; + mc->get_default_cpu_node_id =3D riscv_numa_get_default_cpu_node_id; + mc->numa_mem_supported =3D true; + /* platform instead of architectural choice */ + mc->cpu_cluster_has_numa_boundary =3D true; + mc->default_ram_id =3D "riscv_rvserver_ref_board.ram"; + + object_class_property_add_str(oc, "aia-guests", + rvserver_ref_get_aia_guests, + rvserver_ref_set_aia_guests); + sprintf(str, "Set number of guest MMIO pages for AIA IMSIC. Valid valu= e " + "should be between 0 and %d.", RVSERVER_IRQCHIP_MAX_GUEST= S); + object_class_property_set_description(oc, "aia-guests", str); +} + +static const TypeInfo rvserver_ref_typeinfo =3D { + .name =3D TYPE_RISCV_SERVER_REF_MACHINE, + .parent =3D TYPE_MACHINE, + .class_init =3D rvserver_ref_machine_class_init, + .instance_init =3D rvserver_ref_machine_instance_init, + .instance_size =3D sizeof(RISCVServerRefMachineState), + .interfaces =3D riscv64_machine_interfaces, +}; + +static void rvserver_ref_init_register_types(void) +{ + type_register_static(&rvserver_ref_typeinfo); +} + +type_init(rvserver_ref_init_register_types) --=20 2.43.0 From nobody Fri Jun 19 02:44:26 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=1781127790; cv=none; d=zohomail.com; s=zohoarc; b=Ly1Y0BSeZGZtcdZxdf+dGQg4TWhvTnG54i2vezLHxu6yLuRjuDMhvWgB6pnz8NXpb2Z7i+5EfYBXi+k6oNoViuOXT9oxJKov5aP8/nOleK44q6olk/aIsOiyv1ZOzqqbYNg80aSioANCJmFZ+Kg6clRnK7iiQRvOZyPrOitS9Oc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781127790; 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=xzqVlqQbKnN+Jvsm8C2zgPnETC+7cxM6t422Dn06aYE=; b=MGlzXBdAjOAJMMPzuqeDYpzZROd5Qj15vsi8YSg5WMt4Tr2k8MvAnAr5hGOnLDs8BJArv+1UJU+IFZRGioh+0T0ngSF7NgNDWLqQcyDhso2sv2cpPocrBZ8UmADZlYQ+hBB4STPIW6qSNJntn/ne2STldiqW9rmICTg6mNUv+FY= 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 1781127790585897.6259648829197; Wed, 10 Jun 2026 14:43:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXQhB-0007Ea-6R; Wed, 10 Jun 2026 17:42:51 -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 1wXQgu-00075V-EH for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:29 -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 1wXQgi-00039y-Ba for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:24 -0400 Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65AJYAdP2568431 for ; Wed, 10 Jun 2026 21:42:05 GMT Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eqe6u0eny-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 10 Jun 2026 21:42:04 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-5177b8def69so151980931cf.2 for ; Wed, 10 Jun 2026 14:42:04 -0700 (PDT) Received: from QCOM-UWl2o8bcGT.qualcomm.com ([177.170.117.62]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5a6d777996csm20766280e0c.7.2026.06.10.14.41.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Jun 2026 14:42:02 -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=xzqVlqQbKnN +Jvsm8C2zgPnETC+7cxM6t422Dn06aYE=; b=CVBu/R6j8udLZj0NbqXRx3yEM7i VfMWmVneN77RdvBYR4VEZUpVa/drwg7edpww9VQ7eEuMT4VqOcUoOqISWtXpjHmY p0fwEuxlnX/1s4WTTXWJIbbqNxTKvnhq1O0DF4dHdVTfsJ1s/4nSmsvlUVeVvsOb rWIempXXijslU+rOOj3l9kfADdnUswZH+fgslZthqrH/JjQrrqPUR6OlNLvElDLC 2aFv0kPVfR2S5V3RRbrV/jfiW7txnM8pysLz76atNWvsWTHYx3GuvFhNIfuUWQb5 60PLEhikFgUWA9oV34BItGpq9zhzLdKinFz3mbG+FyVx38u+JUv4L9ezscg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1781127724; x=1781732524; 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; bh=xzqVlqQbKnN+Jvsm8C2zgPnETC+7cxM6t422Dn06aYE=; b=avqW0pjyA8swf3MsX4ZG+mArh4RGlkZKDd241yDrWpiBPnRshiO+UMOkI41jK9xbSP ZOmXagrrRqnsV/6hCkvXqwYQOCigJ4ers+vLC9WzD8i2psApA1HN+F9RP97eOuiB5jtF s1NDFM9B0Ip1jhukvvWCUHTNWT7chkApMaMmF+O6r18r0npQHS4OlF8Bl9wH2qXHk8JO RinjsoT5V5gAIue5oNVIrAJc0ecwQ24xtiNkv9RPMb0pgwSUgihaXGnuosMtY2qccxaa kYz27/IuqqULjdQDPgfER44w6veNBXShb8VfXV0T8ghlaP8Vm+tSInWMpxoVwqpBLt/B bGRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781127724; x=1781732524; 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; bh=xzqVlqQbKnN+Jvsm8C2zgPnETC+7cxM6t422Dn06aYE=; b=RhBJ+tXa65ANQOnuNYlFem8m4keF26o/pwlOVVgZvgVfleZg3HBGunjilGg86Ey3tE yY2OD/YS/3SGrnNKLYOuio27n8fLgx3FSYFcqiBZXTBRkxsEvN3k4TOctc6KkO2rJmOc fgBzYcSQkv84i3oS7aF0TyABOl1onbDaqOe6CvoIFXDh6+p0dSHqqc1l6GeC2gFMykZJ sRE21EcHyt+1uja+7xAUXROnKkP8IUnfiyhTRsq1pHeHaSOsrj2TC3ozRwq+A16trgrR fMpiQ3fb4d9RXUrBDyhGLZxo7lJg0MzIgwFlTLM4VxdydwsUrCYmMXxyuKk62O84H6Cb /9QQ== X-Gm-Message-State: AOJu0YwvlBewfBd0YslHJ8vR4JCvBjhupLnh3j0nfPMRD1IpEPux8YFV PJXJpUrPLv19YbS0TUvD5xhnKAwJvMO18HiuoAvEbugwasNgz9n0eM7ubiXfli14fM/2O2m7wPG iiGk/2dWgebl9PyZq1z6sRdv7io23RUk6SPFAg3E7GL4TlJImZpB9yvvlrhweWpGzYw== X-Gm-Gg: Acq92OE4/fO6JnhS4YvrCCkzPhnEn4UzIuRGhstj5BzvxmPSFjEbIxCxPuwWr3inntO qkMQIMNsRI2gxNvc5D70jl3ApO2fsELmavvisn0YpjQwRWDBWCjqK/cSU64lbxd1FvCRLrq0jhk GNLgZK8qkz0YsBMTQfMTxQRFkt+wh4cDtuy7Kya1u6UcjHNQI57Kw/DOrsq+RqZmVB8rdrBTNRw Ecl4In9obddsT1xu/J0hRYxsGgOlr4vcCuF0Opv5OrOpwKMEikYhcaXBRQ71R5cuoCwAzDv9brm EFqx9UoYtgJvEJnA009gvM4HOJ5uCQlZWi95NYiB10tq/+bAveuhkRmd7xzBdc43KU2ix4chyDE a5G7aZW0CWKQIbBtD57udSxxi55t9rdvEVbUq9TFWyh29ZuUYO3xnxJ1wql9b+kNJIs4JHA== X-Received: by 2002:ac8:5fc5:0:b0:50d:8080:2a7 with SMTP id d75a77b69052e-517edd19e52mr1410711cf.21.1781127723927; Wed, 10 Jun 2026 14:42:03 -0700 (PDT) X-Received: by 2002:ac8:5fc5:0:b0:50d:8080:2a7 with SMTP id d75a77b69052e-517edd19e52mr1410361cf.21.1781127723539; Wed, 10 Jun 2026 14:42:03 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, andrew.jones@oss.qualcomm.com, leif.lindholm@oss.qualcomm.com, uwu@icenowy.me, Daniel Henrique Barboza , Palmer Dabbelt Subject: [PATCH v8 4/7] tests/functional/riscv64: add riscv-server-ref tests Date: Wed, 10 Jun 2026 18:41:30 -0300 Message-ID: <20260610214133.1882563-5-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> References: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: kweDUwtPVh2yprZqGdTpa9PwnHyo9gJS X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX1PholSJJGYe3 Vmz+W8CmlXzwuaLiwAN5FIKs1S0uQZzR7/T2eb3tVR3+MR0A8v19anQwQU3yxFJU6N02AbfCIZU WVltWD5muOg+Yy8M6MG9NFr9HReMPt4= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX1ouM8rbVXTRo RITejKevDv/qLnaDTAmz0gBvQnSrJNe4p4CMsyGsOMR1FS6Hogf6Dvam7dh0d4zWhMLLnpbss9N Le3xqG/SPISqPeQyFa09mBxU9CvExOzJLSXSzEKtJiAqzdQiNu1vpNqrzlQfQ6MD+HK/mtSjzao +0+2mc1sUvKzCiswJ0jGG5u2lPqXU12B5JVin6/ng9ExUGt3gHBr3NKfBrkGbZen0qHo0O++7IF xJepH0fZXMofpPZedKl3MYdBnMgFNh+EsIs/8jlsCG61FLVx/QK1wot4GkNBC2F7cu3wsmImtDD pD99MbTet2cKAW4hLIEVTItfSY0mT4rB2wxFVpZsJW6WtoEr/lX1Va9VcKLQ7Pf2GVC+gdYAKcL wUmpIjk2ayySh0ULVKuR3ROMGrHVDVjAh89pcJFN5fGKYk8KwnEW+Gz/ZQZqkmyR/MOPlpyY0Aq GiocdSSrgTEtLJ/xw5g== X-Authority-Analysis: v=2.4 cv=F5lnsKhN c=1 sm=1 tr=0 ts=6a29da2c cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=gdiugJE53z4H+vvYeRBHqw==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=NEAV23lmAAAA:8 a=EUspDBNiAAAA:8 a=yP2ew68suBmvg3bkYxkA:9 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-ORIG-GUID: kweDUwtPVh2yprZqGdTpa9PwnHyo9gJS X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-10_04,2026-06-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 clxscore=1015 adultscore=0 bulkscore=0 suspectscore=0 impostorscore=0 priorityscore=1501 spamscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606100207 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=daniel.barboza@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, RCVD_IN_MSPIKE_H2=0.001, 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: 1781127791338158500 Content-Type: text/plain; charset="utf-8" Add two tests for the recently added riscv-server-ref machine: - a new test_opensbi.py test. The idea is to have a quick test that can catch trivial regressions that would prevent OpenSBI to finish; - a new Linux boot "thorough" test that will boot the machine up to the buildroot prompt. Signed-off-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis Reviewed-by: Chao Liu Reviewed-by: Nutty Liu --- tests/functional/riscv64/meson.build | 2 + tests/functional/riscv64/test_opensbi.py | 4 ++ tests/functional/riscv64/test_server_ref.py | 59 +++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100755 tests/functional/riscv64/test_server_ref.py diff --git a/tests/functional/riscv64/meson.build b/tests/functional/riscv6= 4/meson.build index 5871211e89..2eb12586bf 100644 --- a/tests/functional/riscv64/meson.build +++ b/tests/functional/riscv64/meson.build @@ -2,6 +2,7 @@ =20 test_riscv64_timeouts =3D { 'boston' : 120, + 'server_ref' : 120, 'tuxrun' : 120, } =20 @@ -13,6 +14,7 @@ tests_riscv64_system_quick =3D [ tests_riscv64_system_thorough =3D [ 'endianness', 'boston', + 'server_ref', 'sifive_u', 'tuxrun', ] diff --git a/tests/functional/riscv64/test_opensbi.py b/tests/functional/ri= scv64/test_opensbi.py index d077e40f42..057f55f90b 100755 --- a/tests/functional/riscv64/test_opensbi.py +++ b/tests/functional/riscv64/test_opensbi.py @@ -32,5 +32,9 @@ def test_riscv_virt(self): self.set_machine('virt') self.boot_opensbi() =20 + def test_riscv_server_ref(self): + self.set_machine('riscv-server-ref') + self.boot_opensbi() + if __name__ =3D=3D '__main__': QemuSystemTest.main() diff --git a/tests/functional/riscv64/test_server_ref.py b/tests/functional= /riscv64/test_server_ref.py new file mode 100755 index 0000000000..2ecfcf60ad --- /dev/null +++ b/tests/functional/riscv64/test_server_ref.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +# +# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. +# +# SPDX-License-Identifier: GPL-2.0-or-later +# +""" +riscv-server-ref board test +""" + +from qemu_test import QemuSystemTest, Asset +from qemu_test import wait_for_console_pattern + +class RiscvServerRefTest(QemuSystemTest): + """ + Test the riscv-server-ref board + """ + + ASSET_KERNEL =3D Asset( + ('https://github.com/danielhb/qemu-machine-boot/raw/refs/heads/' + 'master/riscv/images/virt64/buildroot/Image'), + '6bacc876c769c1bb6057d2bf549eba67fbe83916e8223f9fe21c8e8fff665a36') + + ASSET_ROOTFS =3D Asset( + ('https://github.com/danielhb/qemu-machine-boot/raw/refs/heads/' + 'master/riscv/images/virt64/buildroot/rootfs.ext2'), + 'f00bb88749f945d80675540a1338bd1ccb226574685a5b6c65ab44027d0411a8') + + def test_boot_linux_test(self): + self.set_machine('riscv-server-ref') + kernel_path =3D self.ASSET_KERNEL.fetch() + rootfs_path =3D self.ASSET_ROOTFS.fetch() + + self.vm.add_args('-kernel', kernel_path) + self.vm.add_args('-append', 'rw rootwait root=3D/dev/sda') + self.vm.add_args('-drive', + f'file=3D{rootfs_path},format=3Draw,id=3Dhd0,snapshot=3Don,if= =3Dnone') + self.vm.add_args('-device', 'ahci,id=3Dahci') + self.vm.add_args('-device', 'ide-hd,drive=3Dhd0,bus=3Dahci.0') + + self.vm.set_console() + self.vm.launch() + + # Wait for OpenSBI + wait_for_console_pattern(self, 'OpenSBI') + + # Wait for Linux kernel boot + wait_for_console_pattern(self, 'Linux version') + wait_for_console_pattern(self, 'Machine model: qemu,riscv-server-r= ef') + + # Test e1000e network card functionality + wait_for_console_pattern(self, 'e1000e') + wait_for_console_pattern(self, 'Network Connection') + + # Wait for boot to complete - system reaches login prompt + wait_for_console_pattern(self, 'Run /sbin/init as init process') + +if __name__ =3D=3D '__main__': + QemuSystemTest.main() --=20 2.43.0 From nobody Fri Jun 19 02:44:26 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=1781127819; cv=none; d=zohomail.com; s=zohoarc; b=R9Tg4RPvkIBk5yyt1U2scJmUm/8s3J5eO8GY16xbj0wgyiceSssHRe25YPh9paj8PmbCQjZ4TC9hnHCWFrkZVqUYZTWI/L46SBcPDaja+8sM0/AAyyGug0RvZZsf4uaJpMBmx7XW+h5aeJLJY666wZorvtooocm6875RAiwPnXs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781127819; 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=udmSzSUa6z+gUWugoUUUxrU6odPhMe9N3fOewRK4CqU=; b=JHzGG7UJehhkjX1cJ2i6VOauMSb0ddELYRu6+BRG+eeAVwB3zDzKWdwcOUVIpnOzm7puxBM7bnlT38atbUGRtwPBAzaPp1wVu4MH5eLlyG3tiq3eTXGXNsEYzr80SuIQMONO2kRP4NzYfYT6rGRjKEuG7HbxlhoRWGxoODi8TFA= 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 1781127819524304.98501611774645; Wed, 10 Jun 2026 14:43:39 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXQhY-0007dD-Ir; Wed, 10 Jun 2026 17:43:08 -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 1wXQgu-00075P-9T for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:29 -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 1wXQgi-0003Af-7H for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:18 -0400 Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65AJaH8e2561249 for ; Wed, 10 Jun 2026 21:42:09 GMT Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eqe71gjb2-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 10 Jun 2026 21:42:09 +0000 (GMT) Received: by mail-qv1-f71.google.com with SMTP id 6a1803df08f44-8cce1c3c26bso31379076d6.2 for ; Wed, 10 Jun 2026 14:42:09 -0700 (PDT) Received: from QCOM-UWl2o8bcGT.qualcomm.com ([177.170.117.62]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5a6d777996csm20766280e0c.7.2026.06.10.14.42.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Jun 2026 14:42:07 -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=udmSzSUa6z+ gUWugoUUUxrU6odPhMe9N3fOewRK4CqU=; b=gsa9NmBFgCeC1nvxbbrDmAeWhCx L5JJjHl60Fhig/bTFGVLaRzt197h9Vy8J5O2eV7s80wj9D5pjXDOxhDyJ4+dHtk0 eH/IIx4OV0Scv4HA0PWX+LuHTAAneB8xgzDMIKN2fD5VsSl+jXhmiqrgQlE0AoOt JzbN9cFUmDHh0ZyT2bVV/5Xih9y5u6JUW8zpWmxzqZ3mD3RcIlN/1bU89OeV/k5f 9Gt82YvYnKz0kQrCcLPkvYpjKX3ZTc9bjjYM6sxPoNLDKTX5DUuuTrpmERxDCJkE brixj5E75FhtWGu0TagNFMgjRlYUXXor213YpCNWTlPelIBrEop99azVNvw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1781127729; x=1781732529; 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; bh=udmSzSUa6z+gUWugoUUUxrU6odPhMe9N3fOewRK4CqU=; b=UgyaMsydOiefP8peClAjEx8mFX9FJ2q6CVV/0PsEoWbWRI8d3enx+SwIhi4imTraOo eoBLPPJJ/lscZFP3PfpwoWCIDZY+83lXMRmv7VCfKl+P3WcIeDP8Y5/aWJT4yxj68K12 F0h3hrnxvghlJK/w4v09U2S/gaJEPINmgWtMsvKLantPHtIjWufOE2/sdvZ7p77LYXff UM1hmDtaIapMKrtTqO4rGGXjXLcMj1pwfUuDc1/S99wG62j4C0o74bBM9O4jeSgYrF9y VupVOYomeYlmqSTYD/yMjE50oR5qOwuLeoV1Fi19jam/RWgeBBB4gG9XkmzTvCEGWha7 DjyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781127729; x=1781732529; 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; bh=udmSzSUa6z+gUWugoUUUxrU6odPhMe9N3fOewRK4CqU=; b=QuWrurElQD1PN1RgXh8mSnJOh9oUFXcgXgmTQ66WSrlPV7BJ1F1S84nWkSbpOGGHF3 dOatcEd87IpQH7HXFW5Er+v3u8OBLh1xzVGjzUCA/QWNZVLvjzCFq4U2hUyiyXaTOFZr 54wXQyOeAHFMZHpS40AFQBRO7NLwrVj15hPJ/sLrTvClMraBK0T7gaF7B05h7yqlwerU u2LSBngTBtePNuwAc8NyK/DkoRf67RGsd2SvWEbQMXNMxHRo2yzIEn8r3YCg85Lb9MVO swv/KRD9NvjR2KYXuOma/Y6yDiXQraAbZB7If1XxW7RVYG+IQ2vj8ShgMaHOKSKjg+ue fB1A== X-Gm-Message-State: AOJu0YxBxm68u+GSNTyZADxHqBOKccWemxY0Sg3aflWwtEyeDjxM7TBG 3Pm68QPrduYomig25zOti5SZfbflQ3NzwqM8E7QF1YHT8wVHLpX7xryCKjBeJxl7jaArPe/I/Ko psZZ4irzDxrUfQE19Sx69K9Jnu7Og/HX/66j9MoumA5R0z5OKo7BFrxNRVc8/zS11Lg== X-Gm-Gg: Acq92OHbhoW5BOFdHmQnB4IU0pSnAQeQqhUGYId9Xz2qzMQl35qjS3TF/5VaU8/JkAq 61gS/cMD8x54E8ymPeiTzEwR4jrqqs1kuej02G+7ID33Q890wlTWfBwBP29Hg3mCHaRmNN0GXGD AVGAFrYF9/VrbHsGQyTyM9s2h9ZEAmsf8WWv9EoOqnTTbWe/FhbpjJm1QDbFYOVxq0c+5ltETLl zcIcC1au+JN+2jXRYNjqHQtoknMYueD2V3jMrl+uqz2IgSfFaP1ZLNROUap69YqeyRYtD1I+M+2 KB51wc4lV8KUCKarVt62AnxOLM/RUerFPSZm55UT7cZoqGj/jeG4CwIRfneaFqPOXITfKeUpFWl JQwkMDhXPemG0AMg8oI29ZxjN+INgYRc+eJlRcPPZ1uaZPmTVVnOUqfn74jHV6AfTlz9vlw== X-Received: by 2002:a05:622a:493:b0:517:9f43:4732 with SMTP id d75a77b69052e-517edd32107mr1276321cf.11.1781127728690; Wed, 10 Jun 2026 14:42:08 -0700 (PDT) X-Received: by 2002:a05:622a:493:b0:517:9f43:4732 with SMTP id d75a77b69052e-517edd32107mr1275761cf.11.1781127728273; Wed, 10 Jun 2026 14:42:08 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, andrew.jones@oss.qualcomm.com, leif.lindholm@oss.qualcomm.com, uwu@icenowy.me, Daniel Henrique Barboza , Paolo Bonzini , Palmer Dabbelt Subject: [PATCH v8 5/7] hw/riscv/server_platform_ref.c: add platform bus and TPM support Date: Wed, 10 Jun 2026 18:41:31 -0300 Message-ID: <20260610214133.1882563-6-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> References: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-ORIG-GUID: Pr71F-H_LmFuJpveLUnhTrVSK-Z1acjw X-Proofpoint-GUID: Pr71F-H_LmFuJpveLUnhTrVSK-Z1acjw X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfXyoGKAnbA4acg o7T4pGuwbHcFsof5bqwB38cdtHhdOfwWHZqIIplnDjgqCLEvf71PjIsWam4u/ca6K+AYb0q4m/1 QH8WwdptgZARXmt8t53Pg8sRK1hhA51+G+WeluQcRkKMQoaWObkX+AMp/J9WFom1w6ZtXPaVCTD oqAf2M28AdKLZlBBo8REk96bKvfsckUUTjMRASJYJJo0fxTXxuMaesR/Y6kJiTN8h/tUJn3/pKt vM6CCkzsZFFB+Rx8PVGUDb/LcBRYxfW//ZTL45lP/TYg0roXybaWXOKaCCZMZpeaEPpklP21Pqm d4Na7D23zQ2MirYvi2FXnLLH+kw8nVs7eF8vJ1LxqdEqovdwczxOFOS6FO0NV/0W2lh5o6Z5Agc 1/h9/pOmANxrFBnD0kDn4IjY22Xs19I01w3Gdz0AAdBBlSBqY2+nOk/YOIzQrcq29oYUuG4PV3i JqbXGCJ6slRPhWdQtKQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfXxLTeojIDQ6UZ JileQmOgH5zdYGvDIFg8UWp/C3phGv7Wro+rquwvz8yZQ46Lie0LGLHu8NqzjQ2QZsTkqFRSFFy 9cbEtMKCkk+oD1K+opknw4YtQ9QdwSc= X-Authority-Analysis: v=2.4 cv=Lf0MLDfi c=1 sm=1 tr=0 ts=6a29da31 cx=c_pps a=UgVkIMxJMSkC9lv97toC5g==:117 a=gdiugJE53z4H+vvYeRBHqw==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=NLiCwHATAAAA:8 a=EUspDBNiAAAA:8 a=HCLQLsBmYQwgZ2F9z0YA:9 a=1HOtulTD9v-eNWfpl4qZ:22 a=F9tHCgz3TLBaZgltkx5D:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-10_04,2026-06-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 priorityscore=1501 spamscore=0 lowpriorityscore=0 malwarescore=0 suspectscore=0 phishscore=0 clxscore=1015 bulkscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606100207 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=daniel.barboza@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: 1781127822217154100 Content-Type: text/plain; charset="utf-8" The RISC-V Server Platform spec requires a TPM device. TPM devices in QEMU comes usually in two flavors: emulated or passthrough. A passthrough device requires a host TPM device that the QEMU process can borrow and it's usually coupled with KVM acceleration. To use the TPM emulator we'll need help from an external TPM emulator called swtpm. More info can be found in [1]. For our purposes this is a process that, if running Ubuntu, can be installed via 'swtpm' package. We'll go back to it shortly. For now, adding support for the emulated TPM device 'tpm-tis' (other TPM flavors might work as well, 'tpm-tis' is the one tested with this work) requires a platform bus. Adding a platform bus will open the door for more devices to be added in the board. This is ok - a reference board isn't a restricted board and users are free to add devices at their leisure. Here's how to use tpm-tis with the riscv-server-ref board after applying this patch: - in a separated shell/term run 'swtpm' (--log is optional): $ mkdir /tmp/mytpm1 $ swtpm socket --tpmstate dir=3D/tmp/mytpm1 \ --ctrl type=3Dunixio,path=3D/tmp/mytpm1/swtpm-sock \ --tpm2 \ --log level=3D20 Then start QEMU with: $ qemu-system-riscv64 -M riscv-server-ref (...) \ -chardev socket,id=3Dchrtpm,path=3D/tmp/mytpm1/swtpm-sock \ -tpmdev emulator,id=3Dtpm0,chardev=3Dchrtpm\ -device tpm-tis-device,tpmdev=3Dtpm0 [1] https://qemu-project.gitlab.io/qemu/specs/tpm.html Signed-off-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis --- hw/riscv/Kconfig | 1 + hw/riscv/server_platform_ref.c | 92 +++++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 2 deletions(-) diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index 1807c423ff..d3912cbb1e 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -73,6 +73,7 @@ config RISCV_SERVER_PLATFORM_REF bool default y depends on RISCV64 + imply TPM_TIS_SYSBUS select RISCV_NUMA select GOLDFISH_RTC select PCI diff --git a/hw/riscv/server_platform_ref.c b/hw/riscv/server_platform_ref.c index 7e626c6eb7..790d9861f3 100644 --- a/hw/riscv/server_platform_ref.c +++ b/hw/riscv/server_platform_ref.c @@ -14,6 +14,7 @@ #include "qapi/error.h" #include "qapi/qapi-visit-common.h" #include "hw/core/boards.h" +#include "hw/core/platform-bus.h" #include "hw/core/loader.h" #include "hw/core/sysbus.h" #include "hw/core/qdev-properties.h" @@ -39,6 +40,7 @@ #include "system/runstate.h" #include "system/system.h" #include "system/tcg.h" +#include "system/tpm.h" #include "system/qtest.h" #include "target/riscv/cpu.h" #include "target/riscv/pmu.h" @@ -72,6 +74,8 @@ #define SYSCON_RESET 0x1 #define SYSCON_POWEROFF 0x2 =20 +#define RVSERVER_PLATFORM_BUS_NUM_IRQS 8 + #define TYPE_RISCV_SERVER_REF_MACHINE MACHINE_TYPE_NAME("riscv-server-ref") OBJECT_DECLARE_SIMPLE_TYPE(RISCVServerRefMachineState, RISCV_SERVER_REF_MA= CHINE) =20 @@ -88,6 +92,8 @@ struct RISCVServerRefMachineState { int fdt_size; int aia_guests; const MemMapEntry *memmap; + + DeviceState *platform_bus_dev; }; =20 enum { @@ -106,6 +112,7 @@ enum { RVSERVER_DRAM, RVSERVER_PCIE_MMIO, RVSERVER_PCIE_PIO, + RVSERVER_PLATFORM_BUS, RVSERVER_PCIE_ECAM, RVSERVER_PCIE_MMIO_HIGH }; @@ -114,7 +121,8 @@ enum { RVSERVER_UART0_IRQ =3D 10, RVSERVER_RTC_IRQ =3D 11, RVSERVER_PCIE_IRQ =3D 0x20, /* 32 to 35 */ - IOMMU_SYS_IRQ =3D 0x24 /* 36 to 39 */ + IOMMU_SYS_IRQ =3D 0x24, /* 36 to 39 */ + RVSERVER_PLATFORM_BUS_IRQ =3D 40, /* 40 to 48 */ }; =20 /* @@ -147,6 +155,7 @@ static const MemMapEntry rvserver_ref_memmap[] =3D { [RVSERVER_IOMMU_SYS] =3D { 0x102000, 0x1000 }, [RVSERVER_ACLINT] =3D { 0x2000000, 0x10000 }, [RVSERVER_PCIE_PIO] =3D { 0x3000000, 0x10000 }, + [RVSERVER_PLATFORM_BUS] =3D { 0x4000000, 0x2000000 }, [RVSERVER_APLIC_M] =3D { 0xc000000, APLIC_SIZE(RVSERVER_CPUS_M= AX) }, [RVSERVER_APLIC_S] =3D { 0xd000000, APLIC_SIZE(RVSERVER_CPUS_M= AX) }, [RVSERVER_UART0] =3D { 0x10000000, 0x100 }, @@ -214,6 +223,34 @@ static void rvserver_flash_maps(RISCVServerRefMachineS= tate *s, rvserver_flash_map(s->flash[1], flashbase + flashsize, flashsize, sysm= em); } =20 +static void create_platform_bus(RISCVServerRefMachineState *s, + DeviceState *irqchip) +{ + DeviceState *dev; + SysBusDevice *sysbus; + int i; + MemoryRegion *sysmem =3D get_system_memory(); + + dev =3D qdev_new(TYPE_PLATFORM_BUS_DEVICE); + dev->id =3D g_strdup(TYPE_PLATFORM_BUS_DEVICE); + qdev_prop_set_uint32(dev, "num_irqs", RVSERVER_PLATFORM_BUS_NUM_IRQS); + qdev_prop_set_uint32(dev, "mmio_size", + s->memmap[RVSERVER_PLATFORM_BUS].size); + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + + s->platform_bus_dev =3D dev; + + sysbus =3D SYS_BUS_DEVICE(dev); + for (i =3D 0; i < RVSERVER_PLATFORM_BUS_NUM_IRQS; i++) { + int irq =3D RVSERVER_PLATFORM_BUS_IRQ + i; + sysbus_connect_irq(sysbus, i, qdev_get_gpio_in(irqchip, irq)); + } + + memory_region_add_subregion(sysmem, + s->memmap[RVSERVER_PLATFORM_BUS].base, + sysbus_mmio_get_region(sysbus, 0)); +} + static void create_pcie_irq_map(RISCVServerRefMachineState *s, void *fdt, char *nodename, uint32_t irqchip_phandle) @@ -585,6 +622,16 @@ static void create_fdt_socket_aplic(RISCVServerRefMach= ineState *s, aplic_s_phandle, 0, false, num_harts); =20 + if (socket =3D=3D 0) { + g_autofree char *aplic_name =3D fdt_get_aplic_nodename(aplic_addr); + MachineState *ms =3D MACHINE(s); + + platform_bus_add_all_fdt_nodes(ms->fdt, aplic_name, + s->memmap[RVSERVER_PLATFORM_BUS].ba= se, + s->memmap[RVSERVER_PLATFORM_BUS].si= ze, + RVSERVER_PLATFORM_BUS_IRQ); + } + aplic_phandles[socket] =3D aplic_s_phandle; } =20 @@ -1265,6 +1312,8 @@ static void rvserver_ref_machine_init(MachineState *m= achine) =20 gpex_pcie_init(system_memory, pcie_irqchip, s); =20 + create_platform_bus(s, mmio_irqchip); + serial_mm_init(system_memory, memmap[RVSERVER_UART0].base, 0, qdev_get_gpio_in(mmio_irqchip, RVSERVER_UART0_IRQ), 399193, serial_hd(0), DEVICE_LITTLE_ENDIAN); @@ -1341,10 +1390,38 @@ static void rvserver_ref_set_aia_guests(Object *obj= , const char *val, } } =20 +static HotplugHandler *rvserver_machine_get_hotplug_handler(MachineState *= ms, + DeviceState *d= ev) +{ + MachineClass *mc =3D MACHINE_GET_CLASS(ms); + + if (device_is_dynamic_sysbus(mc, dev)) { + return HOTPLUG_HANDLER(ms); + } + + return NULL; +} + +static void rvserver_machine_device_plug_cb(HotplugHandler *hotplug_dev, + DeviceState *dev, Error **errp) +{ + RISCVServerRefMachineState *s =3D RISCV_SERVER_REF_MACHINE(hotplug_dev= ); + + if (s->platform_bus_dev) { + MachineClass *mc =3D MACHINE_GET_CLASS(s); + + if (device_is_dynamic_sysbus(mc, dev)) { + platform_bus_link_device(PLATFORM_BUS_DEVICE(s->platform_bus_d= ev), + SYS_BUS_DEVICE(dev)); + } + } +} + static void rvserver_ref_machine_class_init(ObjectClass *oc, const void *d= ata) { char str[128]; MachineClass *mc =3D MACHINE_CLASS(oc); + HotplugHandlerClass *hc =3D HOTPLUG_HANDLER_CLASS(oc); static const char * const valid_cpu_types[] =3D { TYPE_RISCV_CPU_RVSERVER_REF, }; @@ -1370,6 +1447,13 @@ static void rvserver_ref_machine_class_init(ObjectCl= ass *oc, const void *data) sprintf(str, "Set number of guest MMIO pages for AIA IMSIC. Valid valu= e " "should be between 0 and %d.", RVSERVER_IRQCHIP_MAX_GUEST= S); object_class_property_set_description(oc, "aia-guests", str); + + assert(!mc->get_hotplug_handler); + mc->get_hotplug_handler =3D rvserver_machine_get_hotplug_handler; + hc->plug =3D rvserver_machine_device_plug_cb; +#ifdef CONFIG_TPM + machine_class_allow_dynamic_sysbus_dev(mc, TYPE_TPM_TIS_SYSBUS); +#endif } =20 static const TypeInfo rvserver_ref_typeinfo =3D { @@ -1378,7 +1462,11 @@ static const TypeInfo rvserver_ref_typeinfo =3D { .class_init =3D rvserver_ref_machine_class_init, .instance_init =3D rvserver_ref_machine_instance_init, .instance_size =3D sizeof(RISCVServerRefMachineState), - .interfaces =3D riscv64_machine_interfaces, + .interfaces =3D (const InterfaceInfo[]) { + { TYPE_HOTPLUG_HANDLER }, + { TYPE_TARGET_RISCV64_MACHINE }, + { } + }, }; =20 static void rvserver_ref_init_register_types(void) --=20 2.43.0 From nobody Fri Jun 19 02:44:26 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=1781127797; cv=none; d=zohomail.com; s=zohoarc; b=CUjz3J1yR6eWXTyXqFIh4LL3V/IEuodivHK4ESsM85nIo14DfGLDCYP74BYvxUA0/6AYbrGJLW9FkJBiT+IOs+9/69/wf1Uxg58KJs/B+BlLD7FmK+TxcGmUoSD80Msx7tkrZGy7nmximsEm4mhf24QzMZgJ5ywhUZJbQpD+lrk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781127797; 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=tE5gJaTJDHmzLYqIinmlPsIUtD77L0kCiSMoL/P7C90=; b=Wl6KOanOvCpfUJgc02i+rw7RCCs8iaw9vO6sfcGbi2vGbv0p5bwUdhkyMz8UAJy8o3meiB/ROD4fsq8XxzfDLfsUXRzYGhPN7Tg2zVmep9nD/jdKQbUiXkgfWHWXQQ78lMKtfqBhkZB2SjRP+78S/OjuLwyBNVIvJGYUAv5XDio= 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 1781127797856222.04216136142156; Wed, 10 Jun 2026 14:43:17 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXQha-0007kS-FT; Wed, 10 Jun 2026 17:43:10 -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 1wXQh4-0007DL-IN for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:41 -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 1wXQgu-0003Bj-7u for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:33 -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 65AJYUpK2600866 for ; Wed, 10 Jun 2026 21:42:13 GMT Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eqe700f0f-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 10 Jun 2026 21:42:13 +0000 (GMT) Received: by mail-qt1-f197.google.com with SMTP id d75a77b69052e-517e054fe07so28724281cf.1 for ; Wed, 10 Jun 2026 14:42:13 -0700 (PDT) Received: from QCOM-UWl2o8bcGT.qualcomm.com ([177.170.117.62]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5a6d777996csm20766280e0c.7.2026.06.10.14.42.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Jun 2026 14:42:11 -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= tE5gJaTJDHmzLYqIinmlPsIUtD77L0kCiSMoL/P7C90=; b=L2n8VlveGAGRMO0O n0vGPDAZ8vmoBNqTCa2nu+OuCQsBcuiNZjoK4YUSj5gXTcbjq02giG+UeTm7/IHz jckOs+j/vuY46PzK36Tv1R3YYn/RK2JyDh5HfA58w1xU874Th/Za4axKTDwOo2CX RsEg11FH9CCDkc6nd5CZcdNUOUOqXtyamhkihJ4+9nBY5pJ6dbdEvqMvKHnU92QW 0+8Gb5aL51vtCxMn5CtR2l4Y7wFn5PDbwQKMvAuC63Ukz8xgG9RYrZb2AYfu5Mot 53sdW++8o8zRvjMKNCDC41ZRr/bg1EUE1V/KjYEfnyVM4xXFCy8EqOa7xn2472Pt uKOCJg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1781127733; x=1781732533; 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; bh=tE5gJaTJDHmzLYqIinmlPsIUtD77L0kCiSMoL/P7C90=; b=NUNxGJwwLBhyT9fCljCAzruRHBJD4bIAzBmTifcTHMyZ/KdPvL8sFqbYzXt0ei/t0f znyJxcNQXLF6MCXzWet/hdCkUlVnlL+IgUwXpMXOFTfXkQeTG11rLXuMLEDTp+tGbsi4 rKUHvKJiX4A2h5pYlneKECggyyJXNt3gvAd7TKEkUvnKPT1cNmX8Wy4shDX+MWvnJCW5 5KmI0dqt1j9q06XrB7m8JItQHznXQmZ3ZeiYtMhKh6a4OS6K2Pr2PAZKa+hHxZHMyzNj sAjxF3blP/xvqnlCl6pCOtl8BNinSV3uU05K3j/BST9TrHuLaIRDnzwrmjYzTtjUYDR7 xa5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781127733; x=1781732533; 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; bh=tE5gJaTJDHmzLYqIinmlPsIUtD77L0kCiSMoL/P7C90=; b=cE//CJxD/rb9uQjtLhBPD/1Lrm/VAveQZf+HrkK1N2QLjRZN0alGny+1xHGBn7aJiy 0r1xV/0u2FGESRThE6vON+XSvj4G4Tnghvdbmi+Ial8AAUswbmIDKEeHz0meppy0sRmG iYqhYmD+Ik4Zg+/BbEThot++PdOLOB7/kXiVSZw6EONcw3HIFc7VVXcvngOYplz9DJeS fvrs/z0/cOo3wijKzbOG9NgkJUN2/E3tUy0Y5FDtkf8HEw/6rueF2Os0+ij3d2AuTDlV oyVY87CavU3lfnnAz9zb8nMiVie1unxBg3r74pcan3KVJjKtO4MDl2xlFQaWRsHwV/C3 JgOg== X-Gm-Message-State: AOJu0YxqgkIwJtM/8W47ueCLHVj3LQdo2pS7+tvStNB1Xuw6Ghk+q709 rgw4LfgESTL36glO+sfJQnPg7D5ZpB3YaBaZMzoLHATdyWkGZb8neggxc1+qN+GPnwEWCwd9A9J y7Eiya8yPi2ADcc4sCNgHk1d/+MX5elb0n993JjtDV8xZDgUvCPEXnO/K9QXIUXD28A== X-Gm-Gg: Acq92OHC1d2L3XuZcsEUjF4RkO1FKqw6/ghJXKSY9Go/bHrZii8a2cpIxtmaLD+eUIL IuLduZHpXJOMRZtikVxBtF/IUkE5gJEg2Ir9p7Tqmrdj7+kFv4HD1/hK45ua7kifHDOnxoWEsEP XRflZ2iMiWws20kpalSgFyvImnozXujd9LnA7RvWEloZUTTx9smWlnhgAxxbGhRHygIfVIjWXev ePjbjpF8LXq7dlpgEapbyQln9HvoLWWcLssXL59bddDJ1MIz1epeMabWT8W32vDz6byByRcs7ZJ iEvrlfQFwgRI/2JAOFwglVfs+SYZWqTJiBnMCrq/D/59Vk2udxIcMooIobUY82HjwQXe68rBA5V lX1LRh5QUXFsjPcoDGlO0nN/0631nY1249Jq4SAy1dNhI8D+Pe5VrsTywZvi8o/rpkHCF/A== X-Received: by 2002:a05:622a:5a09:b0:516:d943:175c with SMTP id d75a77b69052e-517ee3eb048mr361611cf.56.1781127732634; Wed, 10 Jun 2026 14:42:12 -0700 (PDT) X-Received: by 2002:a05:622a:5a09:b0:516:d943:175c with SMTP id d75a77b69052e-517ee3eb048mr361041cf.56.1781127732253; Wed, 10 Jun 2026 14:42:12 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, andrew.jones@oss.qualcomm.com, leif.lindholm@oss.qualcomm.com, uwu@icenowy.me, Daniel Henrique Barboza , Palmer Dabbelt Subject: [PATCH v8 6/7] tests/functional/riscv64: add riscv-server-ref TPM selftest Date: Wed, 10 Jun 2026 18:41:32 -0300 Message-ID: <20260610214133.1882563-7-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> References: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: yd_1Rht62DrGU5yA8qSMv2B64pvYsckI X-Authority-Analysis: v=2.4 cv=B9eJFutM c=1 sm=1 tr=0 ts=6a29da35 cx=c_pps a=EVbN6Ke/fEF3bsl7X48z0g==:117 a=gdiugJE53z4H+vvYeRBHqw==:17 a=IkcTkHD0fZMA:10 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=9Fx0H_d4LJWXQYxSPGgA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=a_PwQJl-kcHnX1M80qC6:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX+JEFzs8mxkiC fXSCQen7vJIz49EmMdBj+LR0r2c1NtINsVu02In191JF+r8DDkoITGZWVAmn6viWILCH9v2JRqn anfWo3Ck8D6Pd1bLMm36ZApVThcj/cCDs5No88NQoR/SVTRRVbSSworBvSswQmXoxH/wYRCRBsG Qy7a8NiXcoDVK1wp9np1beP0qPhdYILi0rRzN0/SA0G69mL9KbIRw5dGsBK+GpavFz9jAyJ/5In 4YKX+ThO21QqozHYjwvDsd65g11Emqr4RbUvk0NJImpBEGt0ul2G1qi6qk0R2+JFEYf30vZ75UN 1BAy8JT/BLaE8Y+p5Md56ggBE+PnCqh//dJTs1IVkAjiznr7UWlgTD+g9dZSlTAxPlOrDUpQx19 9LuzK74OE2TAQ34WCwfPiOsej6iOYTsXeAn5NWLwMTYvhmeTlcKYc415JoLaYcD96YoCkqwyK+w pmZ0E5nPg408PtJO1lg== X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfXwMMx7SlrJp0b 45gsVr8RNPjqy6lZDn496uYSw2wpP81HSzteesJnuI6kevUGj/5ttrMl867qmbx8XcO/zFM5LLu ThKcHTJPf9D0mhEanvmq+JNJmpDoj+c= X-Proofpoint-ORIG-GUID: yd_1Rht62DrGU5yA8qSMv2B64pvYsckI X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-10_04,2026-06-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 impostorscore=0 malwarescore=0 spamscore=0 bulkscore=0 phishscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606100207 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=daniel.barboza@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: 1781127799901154100 Add a TPM specific selftest for the riscv-server-ref board. The test will be skipped if there's no 'swtpm' in the host. The test has been basically cloned from our Aspeed ast2600 friends. Shoutout to monsieur C=C3=A9dric Le Goater for the code. Signed-off-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis --- tests/functional/riscv64/test_server_ref.py | 31 ++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/functional/riscv64/test_server_ref.py b/tests/functional= /riscv64/test_server_ref.py index 2ecfcf60ad..9b120628dc 100755 --- a/tests/functional/riscv64/test_server_ref.py +++ b/tests/functional/riscv64/test_server_ref.py @@ -8,8 +8,13 @@ riscv-server-ref board test """ =20 +import os +import tempfile +import subprocess + from qemu_test import QemuSystemTest, Asset from qemu_test import wait_for_console_pattern +from qemu_test import skipIfMissingCommands =20 class RiscvServerRefTest(QemuSystemTest): """ @@ -26,7 +31,7 @@ class RiscvServerRefTest(QemuSystemTest): 'master/riscv/images/virt64/buildroot/rootfs.ext2'), 'f00bb88749f945d80675540a1338bd1ccb226574685a5b6c65ab44027d0411a8') =20 - def test_boot_linux_test(self): + def _test_boot_linux_test(self, tpmstate_dir=3DNone): self.set_machine('riscv-server-ref') kernel_path =3D self.ASSET_KERNEL.fetch() rootfs_path =3D self.ASSET_ROOTFS.fetch() @@ -38,6 +43,22 @@ def test_boot_linux_test(self): self.vm.add_args('-device', 'ahci,id=3Dahci') self.vm.add_args('-device', 'ide-hd,drive=3Dhd0,bus=3Dahci.0') =20 + if tpmstate_dir is not None: + # Note: code taken verbatim from + # tests/functional/arm/test_aspeed_ast2600_buildroot_tpm.py + + # We must put the TPM state dir in /tmp/, not the build dir, + # because some distros use AppArmor to lock down swtpm and + # restrict the set of locations it can access files in. + socket =3D os.path.join(tpmstate_dir, 'swtpm-socket') + subprocess.run(['swtpm', 'socket', '-d', '--tpm2', + '--tpmstate', f'dir=3D{tpmstate_dir}', + '--ctrl', f'type=3Dunixio,path=3D{socket}'], + check=3DTrue) + self.vm.add_args('-chardev', f'socket,id=3Dchrtpm,path=3D{sock= et}') + self.vm.add_args('-tpmdev', 'emulator,id=3Dtpm0,chardev=3Dchrt= pm') + self.vm.add_args('-device', 'tpm-tis-device,tpmdev=3Dtpm0') + self.vm.set_console() self.vm.launch() =20 @@ -55,5 +76,13 @@ def test_boot_linux_test(self): # Wait for boot to complete - system reaches login prompt wait_for_console_pattern(self, 'Run /sbin/init as init process') =20 + def test_boot_linux_test(self): + self._test_boot_linux_test() + + @skipIfMissingCommands('swtpm') + def test_boot_linux_test_tpm(self): + with tempfile.TemporaryDirectory(prefix=3D"qemu_") as tpmstate_dir: + self._test_boot_linux_test(tpmstate_dir) + if __name__ =3D=3D '__main__': QemuSystemTest.main() --=20 2.43.0 From nobody Fri Jun 19 02:44:26 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=1781127799; cv=none; d=zohomail.com; s=zohoarc; b=hqMajTyq4w6kn//RJXU4XXYOTzlOqGi/4XM/sjRQHvKZSll7lOlUaBaTrgMykqEE7lylv4elkcBV/bDgKw7WA6oPkvVGQnQFax7t7PUp2fxWCAFq9/JrjAF1woyfqLyPKFBOaBe3qvL4DHMCJpECJ5LsLvW0Neqte3XjmNDGjp0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1781127799; 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=ZQSLigVw1AgxmF2O8n6Lu9dqbN//eSwXfGSVsl6CqLs=; b=ICH27TVsYEGJ+3nbhg25LJ9nhKDjv9xPnyVqbkxxtUx3+Dh/LmdXBX3b0vIZFFpDFnrMfaW43vxPl+NMt6AGHPRWRkz3rcgeG6VwnOSBJvxG3paMzScLhsuLqxxqfbJtg5exICZIvYD+uk6/XeYThlhGN+hzT8CcjnlrjrTrwpA= 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 1781127799354421.53162782944844; Wed, 10 Jun 2026 14:43:19 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wXQhY-0007aC-29; Wed, 10 Jun 2026 17:43:08 -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 1wXQh4-0007DI-F6 for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:39 -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 1wXQgu-0003DF-0M for qemu-devel@nongnu.org; Wed, 10 Jun 2026 17:42:32 -0400 Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 65AJYUvs2569505 for ; Wed, 10 Jun 2026 21:42:18 GMT Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4eqe6u0eps-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 10 Jun 2026 21:42:18 +0000 (GMT) Received: by mail-qt1-f198.google.com with SMTP id d75a77b69052e-517615db531so190047451cf.1 for ; Wed, 10 Jun 2026 14:42:17 -0700 (PDT) Received: from QCOM-UWl2o8bcGT.qualcomm.com ([177.170.117.62]) by smtp.gmail.com with ESMTPSA id 71dfb90a1353d-5a6d777996csm20766280e0c.7.2026.06.10.14.42.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 10 Jun 2026 14:42:15 -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=ZQSLigVw1Ag xmF2O8n6Lu9dqbN//eSwXfGSVsl6CqLs=; b=N6/mMn20LrcdWRlr+vsE/KVgeTv dl+vm4xD2/i6dnceHu3cJj91vNKbUCo0zHexGN6iABK35bSO3+6pqF8lC+Ta48KO a+2lOdvsTiv9zzpKKchSshxp3vVNn2GlMF0+Zxoexl8UTf+QG7cPKaBmkyqMMYpi g5xC4UTrrb+5UJS8ZEfb5Y75is/3cigUKFFYdh1K9jCCraQbzz5Qa5O2xSw51HUE gKY5gTotCB9guyps25wZQpPVO7O2mKc44QX7iDoKqlSJeVhq/qjt3f/IIGJC1ipj b5H6pjvUShzwvp2An5kBn6GH+HRSLC3lQmV4xAlrxGQZCDEnrrUCtXeLTHg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1781127737; x=1781732537; 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; bh=ZQSLigVw1AgxmF2O8n6Lu9dqbN//eSwXfGSVsl6CqLs=; b=Cz+vTZrAAl32ujouKxzE0mh8U6Cbj4jfCIapNYMPuc+adxG/BV0uq/2/2/3A+tUzXX qEICZlY/RBq2njmyTz6DjmL2kUt8r5HhnN4RfG/4I1Z+iZrnLVR9UacMQagOgupIbCRF 6lqYfumtXt8EuVI5yv855C98ahOy18K4jWPHkrM4c80xXPhhRZYbtxqKrHFzRC14lnhg ppof/O5iIln6QxM9r3Hvxwm4XMnvSO+pS1pzKxy9tpNurenu7zCxseKXeUdcpMmraolT BafM16tVgR/wpjUZYBqUH6efDwdl8DNcSmun1M9fpPXGk+ABbz+e1sddQqe4ORhSrgFW ucbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781127737; x=1781732537; 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; bh=ZQSLigVw1AgxmF2O8n6Lu9dqbN//eSwXfGSVsl6CqLs=; b=PcPizFE7QZR5LbqF0q8BwsBhQwPX8PFmGu+vNtvbH7KzGu32Vl2MqvbLg0/FiIW+Tm FRUA5RiCa1Y625xy9AuY6SXkXMlEECsvl5VQMMPwfr8YVlZVN2IM4bOMJVcgMmt69kJu g0CcDFTZr3srDWkqGAzo5xlfytIctd+71WKigauTuFXxY2TjqPgxzd/NjIjv+ZZv5Dqv ct0glF9c534mognUTFpCul4TqDcKEGZWkfB8JcehszbIbFrldKZRYfxShjQAVTiZdDsx JAnMGGI9n7LGhwsNDnfCl0tXMXDtQxw/Ap7Aqb25NA1gM+K9MvWA0lzKwTDEzqX26EUB 4e3A== X-Gm-Message-State: AOJu0YziiSOFzoNSuL+ABM7Gd7LfXMQj12F1Q3kIec8WHYJSAcEnD5yy YFWStWoUWfiM5+I77ifmVeOFyP/UfvhP6o2SB+/TvHp3ncvPOP2c+Aq+5XK5Ye0sFRQbdSekFG8 9VeP61ScLbfjuNllOfpn3bkS62fyhTkOQcdqAMdFrq4TCOcOByPDtEkZFkF6B45XohA== X-Gm-Gg: Acq92OEg3g/k+DoYkqeSx4MqzVzb005rKCFmi/EJpBL3p/IuiEUdX+OL+oADLGHrZv1 1l26vvvTrQcRL17SrJvTLLc75Z+GfKPZdwmAWa2JLYleZ53pURXPovrozk0mCrANzgiZ//TMk8y HWfTwWYFdAi7I15VXLpplTWPJod6d8cK7MlrWx5dmQDF8xeZKRqpfH2ZtzIKjSCYoX4h/JnBIix WuG+Wq6dOD0nmisOtELlWEADJyeSTuQQoY97QCdaJLX6WfLsX8ywfLHPF7fnMl/P8TcO0SKSw3i y8fdP7n0iM73Vb295VZCqZD+QAyCjfZ8wdsMm7yF0O1Xbw2co9pGHJRXOjIwFu26jRdjJF1elTr q7NeslajvRrxo1Yd+A6KYHgqipcJk1zGWd+pL4OVlRKqUQjX1RvvqCaeR9hea2bUQvjVkhw== X-Received: by 2002:a05:622a:1a92:b0:517:6b57:8164 with SMTP id d75a77b69052e-517ee3d5dcamr394151cf.55.1781127736945; Wed, 10 Jun 2026 14:42:16 -0700 (PDT) X-Received: by 2002:a05:622a:1a92:b0:517:6b57:8164 with SMTP id d75a77b69052e-517ee3d5dcamr393731cf.55.1781127736553; Wed, 10 Jun 2026 14:42:16 -0700 (PDT) From: Daniel Henrique Barboza To: qemu-devel@nongnu.org Cc: qemu-riscv@nongnu.org, alistair.francis@wdc.com, liwei1518@gmail.com, zhiwei_liu@linux.alibaba.com, chao.liu.zevorn@gmail.com, andrew.jones@oss.qualcomm.com, leif.lindholm@oss.qualcomm.com, uwu@icenowy.me, Daniel Henrique Barboza , Pierrick Bouvier , Palmer Dabbelt Subject: [PATCH v8 7/7] docs: add riscv-server-ref.rst Date: Wed, 10 Jun 2026 18:41:33 -0300 Message-ID: <20260610214133.1882563-8-daniel.barboza@oss.qualcomm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> References: <20260610214133.1882563-1-daniel.barboza@oss.qualcomm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Proofpoint-GUID: 06uw2f3_1tWVjUXz0EWwdyL-v0Q9UFgt X-Proofpoint-Spam-Info: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX4xnhW+Ok3g6l bt9neInoUTbUFcm3n0ySUoypvABN4fs7Yh7bnrJVMa7JZKPqDzyY8aQnBssJ7aFC4hJXgQSrYEy V+8lW6OfbecvLZZvCiLu6m6d0/z8cLY= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNjEwMDIwNyBTYWx0ZWRfX859tlneaHJ7c REQsjraf1FZXq/kPa0B2VEmzSzIV+uaZJExOeiKPsjqdNd3MIdq0xQQQkdNuySIWqFpPgI6ywym JvLMu3L520v2oAxlZG5sGJPz4HezBBWVd+tEK2vt2u/aWHn76bBLplMkpwIwM2tl5y9KKPqudjm q3412LZrC3EWMVE3wl8rspuGdacPjrobGrduake86+K4e32N8CR+up1Kqno+9GH6q+w6k2Ni9vX Ca9k0hVqaJR58hf7ZYrOXJqDQtNcFTG1RrmZMmzPI4apNqUAwz9WxM+5t4SV9PuXl5B6T/0xoiv LploaE/J01bMZ9+VvhlafN1Wu1uOACgPA3Zo/ABdWjuQBj+n2OiZn6PRUNKstcbE9eDA3eL6moa XT1E6vp8I2mZ6W1DEx1t3vg0D2c3BqyyR21mdzvUFYNVU0Yn/Eg+Gp+7xacuNwtawfl28C7u+mV lpnS567H05h7hbqufbw== X-Authority-Analysis: v=2.4 cv=F5lnsKhN c=1 sm=1 tr=0 ts=6a29da3a cx=c_pps a=mPf7EqFMSY9/WdsSgAYMbA==:117 a=gdiugJE53z4H+vvYeRBHqw==:17 a=FelO9ux0wxsA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=NEAV23lmAAAA:8 a=NLiCwHATAAAA:8 a=EUspDBNiAAAA:8 a=vlmih187C6Ts2ntwv5oA:9 a=dawVfQjAaf238kedN5IG:22 a=F9tHCgz3TLBaZgltkx5D:22 X-Proofpoint-ORIG-GUID: 06uw2f3_1tWVjUXz0EWwdyL-v0Q9UFgt X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.125,FMLib:17.12.100.49 definitions=2026-06-10_04,2026-06-09_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 clxscore=1015 adultscore=0 bulkscore=0 suspectscore=0 impostorscore=0 priorityscore=1501 spamscore=0 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606040000 definitions=main-2606100207 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=daniel.barboza@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, RCVD_IN_MSPIKE_H2=0.001, 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: 1781127801861154100 Content-Type: text/plain; charset="utf-8" Add documentation for the new riscv-server-ref board. Signed-off-by: Daniel Henrique Barboza Reviewed-by: Alistair Francis --- docs/system/riscv/riscv-server-ref.rst | 62 ++++++++++++++++++++++++++ docs/system/target-riscv.rst | 1 + 2 files changed, 63 insertions(+) create mode 100644 docs/system/riscv/riscv-server-ref.rst diff --git a/docs/system/riscv/riscv-server-ref.rst b/docs/system/riscv/ris= cv-server-ref.rst new file mode 100644 index 0000000000..0573b4e07c --- /dev/null +++ b/docs/system/riscv/riscv-server-ref.rst @@ -0,0 +1,62 @@ +.. SPDX-License-Identifier: GPL-2.0-or-later + +RISC-V Server Platform Reference board (``riscv-server-ref``) +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +The RISC-V Server Platform specification `spec`_ defines a standardized +set of hardware and software capabilities that portable system software, +such as OS and hypervisors, can rely on being present in a RISC-V server +platform. This machine aims to emulate this specification, providing +an environment for firmware/OS development and testing. + +`spec`_ is version 1.0 at the introduction of this board. New spec versio= ns +might trigger a revision of the emulation itself, which will strive to alw= ays +match the latest version available. In case the emulation changes aren't +backwards compatible we'll introduce a versioning scheme, probably via +a machine property, to allow older SW to run with older spec versions. + +The main features included in the riscv-server-ref board are: + +* IOMMU platform device (riscv-iommu-sys) +* AIA +* PCIe AHCI +* PCIe NIC +* No virtio mmio bus +* No fw_cfg device +* No ACPI table +* Minimal device tree nodes + +There are multiple ways of using this reference board. The spec compliant= way +is using an EDK2 image and a TPM device. The board was tested with the TPM +device ``tpm-tis`` that uses the external ``swtpm`` emulator. More info o= n how +to use this device can be found in `tpm`_. + +To use this board coupled with the tpm-tis device, first start the ``swtpm= `` +process in a shell (the ``log`` parameter is optional): + +.. code-block:: bash + + $ mkdir /tmp/mytpm1 + $ swtpm socket --tpmstate dir=3D/tmp/mytpm1 \ + --ctrl type=3Dunixio,path=3D/tmp/mytpm1/swtpm-sock \ + --tpm2 \ + --log level=3D20 + +And then start QEMU with: + +.. code-block:: bash + + qemu-system-riscv64 -M riscv-server-ref \ + -bios fw_dynamic.bin \ + -kernel EDK2.fd \ + -drive file=3Dnvme_disk.ext2,format=3Draw,id=3Dhd0,if=3Dnone \ + -device ahci,id=3Dahci \ + -device ide-hd,drive=3Dhd0,bus=3Dahci.0 \ + -chardev socket,id=3Dchrtpm,path=3D/tmp/mytpm1/swtpm-sock \ + -tpmdev emulator,id=3Dtpm0,chardev=3Dchrtpm \ + -device tpm-tis-device,tpmdev=3Dtpm0 \ + -nographic + + +.. _spec: https://github.com/riscv-non-isa/riscv-server-platform +.. _tpm: https://qemu-project.gitlab.io/qemu/specs/tpm.html diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst index afd86ca2ba..b2aeb39a8e 100644 --- a/docs/system/target-riscv.rst +++ b/docs/system/target-riscv.rst @@ -73,6 +73,7 @@ undocumented; you can get a complete list by running riscv/sifive_u riscv/virt riscv/xiangshan-kunminghu + riscv/riscv-server-ref =20 RISC-V CPU firmware ------------------- --=20 2.43.0