From nobody Sun Sep 28 16:35:45 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; arc=pass (i=1 dmarc=pass fromdomain=htecgroup.com); dmarc=pass(p=reject dis=none) header.from=htecgroup.com ARC-Seal: i=2; a=rsa-sha256; t=1758705612; cv=pass; d=zohomail.com; s=zohoarc; b=maQsgtHxxu+cWlZySBqDTfY58uZdwwnzNvlFYEjdEGT0Shy99N94XVuOd3zlECifbN5vKU10ME2NhYuO1EXzN7jiY1VqUBBf9L9SBzPkIWCtQNqyutPUfl0id/IMxTjqObDD0VmDm1m0q0tG0bXm2WRG9nZlZEUqiuINgnsWCZk= ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1758705612; 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=c/XybDqJr9yiXsKUya/x8IdE0/O3OX+FLwn/04oUvLQ=; b=gsp+BD2i5xCqop6uiqeibYU4H0MXul6U2g42ytPkq2eF8Fkyx74bqJd11zeFMCj5D9zbdCfSnX8ARfxr28z7tQibg3nw3OJsMRdO5SAfx9TlnmPyqnHqAlMUpATqXBALF8xXUQY4I2ZF5PRpX7XnXzPJ1+DaipCKcRQRZVgxR6A= ARC-Authentication-Results: i=2; 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; arc=pass (i=1 dmarc=pass fromdomain=htecgroup.com); dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1758705612128172.79202270544022; Wed, 24 Sep 2025 02:20:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1v1Lei-0003tC-QO; Wed, 24 Sep 2025 05:19:23 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v1LeW-0003mL-3o; Wed, 24 Sep 2025 05:19:08 -0400 Received: from mail-northeuropeazlp170110003.outbound.protection.outlook.com ([2a01:111:f403:c200::3] helo=DU2PR03CU002.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1v1LeR-0002yg-U1; Wed, 24 Sep 2025 05:19:07 -0400 Received: from AS4PR09MB6518.eurprd09.prod.outlook.com (2603:10a6:20b:4fb::5) by VI0PR09MB7826.eurprd09.prod.outlook.com (2603:10a6:800:21b::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9137.20; Wed, 24 Sep 2025 09:18:21 +0000 Received: from AS4PR09MB6518.eurprd09.prod.outlook.com ([fe80::ad50:891a:847c:580a]) by AS4PR09MB6518.eurprd09.prod.outlook.com ([fe80::ad50:891a:847c:580a%4]) with mapi id 15.20.9160.008; Wed, 24 Sep 2025 09:18:21 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Dlck2zu3fODYjutOCp5BvYl48SlsFY/JlYr9AHy005rORSfKaZ2ro2t1EaJ/IxTVJP/UOKP9ZUzL9benUSyerpWNNMhAxKF4IC38SdUAYu4/qV6zE+8WHSy4+DI9kxR8KSWm7YsP//5TXuQaJr34hxrEHhSgSTmvFmh4EchkLJJR5YXh2hVNlMS5FoD88SCiVRWUDz8PRRp5UsoAwEkhvTuXEs0sLHJ15584FagZNIXXpIwWUAAK7dZ5hZ8bMrC+luIFDrrV8r3RxjAGri0SH1xKI9d2wpsplp/IPWwPGYumPXw+2asZC2Bo9YWI096rmZQIavgSbJYSKH4/Z+XMkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=c/XybDqJr9yiXsKUya/x8IdE0/O3OX+FLwn/04oUvLQ=; b=ESLt7YV+fmMaxxPYuaMsc39NxsdWlUQzyERUBgVWTnl4cDS4VMrno3VHwJmPbRV/DVyWn0ku+hdztIlGEQmQv/WTF2KTbzwaPU17SJ0yNqWs9W2fUNAEKfcnwxM4nfF+uYzlkWZIX74Om9O/IKLBU94eoijFJFGgFZAylfsm76/NbcI/MaFDlAhhk6aSK7GTDJMZTd0t8FNYN4j353zmj8L/2X8br0EawoGvnUQeiH7ms+GMtZzQd1Od20IKBd5qcxDSeN6r/yiXuFhw+aSd8c+YdhHL0aMq6TGO8LcTzf4DHlya+uz6//F1pqpgh738m54rvQmDrNSRSRblwaIjWg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=htecgroup.com; dmarc=pass action=none header.from=htecgroup.com; dkim=pass header.d=htecgroup.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=htecgroup.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=c/XybDqJr9yiXsKUya/x8IdE0/O3OX+FLwn/04oUvLQ=; b=ll+YnSYW7BiORgMPVHMKFUvUUzYlY9hhHqR2YSgdEwwqo+AtS4ldE2fYqTpsmGOYMzBEIE+xHQu5ctJv1uXpVbUvveRD/KZEg6IW5rAMxSG3IIlNUsfUXplemRvLJPvzoOMvu37ChMn6yN+SJ7hw9cjoyY2YiMGXKCe3etcqkE3bpQmP7slHEitPC5WsgyGOsd3/pDaceIjyUOVvzDc8wmz+HYze6pSiEPKGQWkncFfrpv3h7tN6be1M3HLc2O7MYVodMew01bsJTlRGOWdENZlr7dITuqBUNdDI7SkqeeQJmoHF3/BFRhp+xDw2stASOXb2/z4a5oAkBaSIdY9u8Q== From: Djordje Todorovic To: "qemu-devel@nongnu.org" CC: "qemu-riscv@nongnu.org" , "cfu@mips.com" , "mst@redhat.com" , "marcel.apfelbaum@gmail.com" , "dbarboza@ventanamicro.com" , "philmd@linaro.org" , Djordje Todorovic Subject: [PATCH v8 11/14] hw/riscv: Add support for MIPS Boston-aia board mode Thread-Topic: [PATCH v8 11/14] hw/riscv: Add support for MIPS Boston-aia board mode Thread-Index: AQHcLTQpl+6QocMAL0qjrE+v2O4DEA== Date: Wed, 24 Sep 2025 09:18:17 +0000 Message-ID: <20250924091746.1882125-12-djordje.todorovic@htecgroup.com> References: <20250924091746.1882125-1-djordje.todorovic@htecgroup.com> In-Reply-To: <20250924091746.1882125-1-djordje.todorovic@htecgroup.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=htecgroup.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: AS4PR09MB6518:EE_|VI0PR09MB7826:EE_ x-ms-office365-filtering-correlation-id: 99de097b-a4ae-40ea-7996-08ddfb4b4e74 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; ARA:13230040|376014|1800799024|366016|38070700021; x-microsoft-antispam-message-info: =?iso-8859-1?Q?AB77VChIgAYL/pgNDL2CYMa6fTrP9CdqWZlj32D7lZ1bQzrFcfHeh/8e6N?= =?iso-8859-1?Q?yHXnMtsw698O7RXS1dcXf/YaikJyXN56O9HMVOAtJ+DULDiBgIjIQx3H7v?= =?iso-8859-1?Q?/kJYSTEdYbJz0ohBH+eGq+NEuURf4wuZFfec4FutiY28RXOICXIFBWrkYB?= =?iso-8859-1?Q?Kd9+Wj0cmmQVsK7Yx2P1bLtCP7Mge1OTztkn0loQatQO4sIwinfZwbEHeE?= =?iso-8859-1?Q?u1S9DanROFaBPpFzyaoPNi7dCxb5/Xt59axy9wu1DaW68B1vuHCRnsDWyF?= =?iso-8859-1?Q?kBimoXjK0JZdlFlOQJvK9PP2o5AXl+iGAg4ztvQqaYY2xwmQw/LhvNIfu/?= =?iso-8859-1?Q?wdj/e6olagRkXAXt2k+gzCGcjfuX3FzgDxd29s0SESj2KZrRE4iUDlq8E2?= =?iso-8859-1?Q?s3vy0nTFQ9+On6J/ZEiQ/fimL9FD/I0Sgi/wdsdqYErP92shLSpFLIFA9x?= =?iso-8859-1?Q?yUQBo37IwrYZAXDPpy7+yZONsQxdx/Lrhds4aAPaH9RZTk9Wc6OQIOBgGt?= =?iso-8859-1?Q?cQ0OOksOG+6GuJdiOQmm+zBI1gBijmEjEtcgwiucmCa/lUydN7OaAGMvj5?= =?iso-8859-1?Q?95eWf3kcnJ6FXKIHlBPPvneVB8oxj96oN1t4etdGA5xW/Mi+3zm5YQ5/jr?= =?iso-8859-1?Q?GOPQWPkQfUXpvOQNvCjVaUmht5MIYLrYJ0hcESJ5BWLgKqGf/4CUAlNSdn?= =?iso-8859-1?Q?dbpu3UuUGAMQ9RCDtBa9fqzxouiRPNZamPZTKFMbbvSc7TUzzQ6k8/A0hJ?= =?iso-8859-1?Q?oivZAUf9Oe5TbHP4zzQeqlD1FTyQrj85l5ZbzgUSKGawA/pP12hdTNLRCZ?= =?iso-8859-1?Q?yMO5q2g6dXjFl/n8C5ktxb+5zTwLtZ/5+QGoywqaAjRyD6geAf17Bpvqmn?= =?iso-8859-1?Q?/m0PLQB1zfR0y1vlJcc3G874m3OYQppgEcCZOjjh43nGOn5keVvNXpYoN7?= =?iso-8859-1?Q?WA6wuPUWsyLYaoeLhse7HB4ip1LNYOdHo6pOzyICmeY/BvkXzNMwhtBFfF?= =?iso-8859-1?Q?MeWo6blas6xhY6l0HUqK8x6h+klY5JGiriWBtTYJS13/bHHwQGAT+ote80?= =?iso-8859-1?Q?ARTpTRGiPnxUn8ls2Dc0HU9zjp84VqxbVe+AuC9n8DIzSGBTG7dBOyC4ww?= =?iso-8859-1?Q?BgXWYvwtcwuf7S5qnhpDmH/8bBuFklYt8pm1YyIj07IuoWO8mcpEvInWEw?= =?iso-8859-1?Q?UafjPXStAgLupg8wu9ei8qL8NVahwFjpmd0/FSGxvEOQoV07NdKeHS2Mkn?= =?iso-8859-1?Q?jNLqK9v3cvhGvs735OydJxgkLUXVNXwjtNa88U5MoJ+h8S2DQBU/C31H2x?= =?iso-8859-1?Q?M0OYYlY8Kj/QF7X1RhcCaJ0kwrSWY+cHTgW+ZLSkvrQrT8c9x/OY6M4Hm0?= =?iso-8859-1?Q?tN3qz2S9hzEY6kRTZ5n+i6iPgssiVO6CIPJUXLJ+nSomiizyegHiY3B7M5?= =?iso-8859-1?Q?Mre9lHcCwgJIeXJ+vXAhz4bJRmzDR1kKcAbznvNtyFZQ+BvdRUkSs7J2iB?= =?iso-8859-1?Q?Aqwd6AjY6CIXKTmtwEm5oF9rpzF4z20RJutnXCgUUTKg=3D=3D?= x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:AS4PR09MB6518.eurprd09.prod.outlook.com; PTR:; CAT:NONE; SFS:(13230040)(376014)(1800799024)(366016)(38070700021); DIR:OUT; SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?iso-8859-1?Q?hCKYZasv1BjvH7RXJLMrUh/qyXU1pRpWiLtg0nB4vgYvXKp7lkrP+7XYlX?= =?iso-8859-1?Q?Kf3Ie53asOXb/h8dDsK1/SvWdCSe/GhL5zj3MjDzSN5tFu5bIUpXV1HjUM?= =?iso-8859-1?Q?NzpSI+DVTIo9kuZUA6C9TE7PIw5Zj/OuNbUT2NrdnRakIPWDc7qDbstZ/F?= =?iso-8859-1?Q?WllkzjOeDUqO47pUgQ9skNr6d9AKbV9tXjmhmaP9x2ZNqY28OU1TAGjBDu?= =?iso-8859-1?Q?cAzbcc6nLYABeicmhqBZr7hgQX3YRVT9uH043VNyuxAVbmY8os+NER6PoP?= =?iso-8859-1?Q?IfMszWZGMB+ACa7PnB9ntI+CXw3ZnmFZZgStAowLEhnDSqr8FYcu+D6iAc?= =?iso-8859-1?Q?C4apR80EcUyJsgXGLevniH5tp+Pr0e7j649WeQVFqHZYSq2u94ReO4LKCq?= =?iso-8859-1?Q?0RM+GWJYhngBL7H1Sxi8kLc4kQqd42XNSihJPvykS5bnkNEcEgCyYvAc8H?= =?iso-8859-1?Q?4xQIWwRvNwKKVya1lwl2Mib6iqZgSWon2rzw0xIY2U97s4TqgBTHixTC8E?= =?iso-8859-1?Q?aFhq9NW1JiTU2s0YS9sHsnIFp2eZkdHkJF2BQX00BxUIuzhQvnJtnCvDXc?= =?iso-8859-1?Q?4l4T7MQnKom0NoadIo/KVtqUaw7GZQx5pzRFe+gK1EkUAfCfl4LvseSU/4?= =?iso-8859-1?Q?njcjqBeohBSiYAzdFLSpo6wii/k59esBRPVm5OGvvhTehbMzHG0tdWu2w6?= =?iso-8859-1?Q?M5mo+rtHJSBGNHaq6nZdKSqE/vIspRP2Tgx6Zk1phWjcdP+E46JakyP6pH?= =?iso-8859-1?Q?B6zrSL40yUdaBeOXQAuVJ0zRL+LVZUiohcHgpWp8RSTciPuMPOtcBXpATT?= =?iso-8859-1?Q?umnizomjwDS3a7x9vKZSjNz5DzJ/yirBr+EfKytKdJbzh6txMEh+bY+xpe?= =?iso-8859-1?Q?kJKd4WUketKisJlsX27BhsB//K+n/KGZkK+ypEy++LLinbSWDaEubyi10A?= =?iso-8859-1?Q?M8My/UldBOZ5qXeUmzLlct5EihmeZGXXsE+9Mj0iWxUi/iH5tOmvBSsuw5?= =?iso-8859-1?Q?5CIst38jXi09uvIGtQS7Os7HaScfZT7y3Q6+7S/qemyiii0/w6bBZYbv/h?= =?iso-8859-1?Q?oNPJGg90PNAHsXqmVaUSfASvdp8WFpYM2nlEyvX7Wr9KiRijmFu90nHTUU?= =?iso-8859-1?Q?RJEBSY2iEIS01uJmCwmHSDmIpvuTVZJXglRnX1P/Uc1B9mSRd32d4oPZu2?= =?iso-8859-1?Q?h8ZBvaV+Yk6KRzwNWA65nnXofDUQVodeyapudbKo1LdMP2RV9bX3jkFB3W?= =?iso-8859-1?Q?Hwi+dN/dq4gG0lO0dM9nr2z/w0equpY1mfJ8IJO+xE6g1efFH2dp6zMXFE?= =?iso-8859-1?Q?RLVmh6vOGioLdt8YZwaykU751/8SRLa69c9sbb4/w/vjZtvqTkdvOsX/tX?= =?iso-8859-1?Q?Slf5maubTJPeNZodQVzASguuD+0S5zYJ6jxLsxK94HMfAr8RuGy6Gybhuo?= =?iso-8859-1?Q?2skHItipd3pgNVjThmx7tN8Ah4IjqnYut+wvm3XDUr2QKePZKaor7up7Hs?= =?iso-8859-1?Q?S7C2x+ikq7apDCT9CCXI12fEya9pXUhivBQeojGFwy3sFqP7I+6XcgKu50?= =?iso-8859-1?Q?NBO05pE2Ezml5H4wIp/UrrqOqGmVhrYgoBogoMTPs0n4XXwt75V6wcEKAR?= =?iso-8859-1?Q?kyyEDkJlZliVTu91ycqKoImrcw48dAFwXspSVQPiLUv7Zf2N/ul7oZtWKX?= =?iso-8859-1?Q?0wBLTmZHYZb2O+ygm3s=3D?= Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: htecgroup.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: AS4PR09MB6518.eurprd09.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 99de097b-a4ae-40ea-7996-08ddfb4b4e74 X-MS-Exchange-CrossTenant-originalarrivaltime: 24 Sep 2025 09:18:17.6043 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 9f85665b-7efd-4776-9dfe-b6bfda2565ee X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: cr6yd8FIZ15e4d0LJIIsszkzoeFW8UbXfo6iBSVxLCZkdmDsi3XA6NC0u6VXW2fWsnf30aXivs89UHRFQItTrjWKrB5FWGS4dz1EblIuPlE= X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI0PR09MB7826 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a01:111:f403:c200::3; envelope-from=Djordje.Todorovic@htecgroup.com; helo=DU2PR03CU002.outbound.protection.outlook.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 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, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @htecgroup.com) X-ZM-MESSAGEID: 1758705613158116600 Content-Type: text/plain; charset="utf-8" The board model supports up to 64 harts with MIPS CPS, MIPS GCR, MIPS CPC, AIA plic, and AIA clint devices. The model can create boot code, if there is no -bios parameter. We can specify -smp x, cores=3Dy,thread=3Dz. Ex: Use 4 cores and 2 threads with each core to have 8 smp cpus as follows. qemu-system-riscv64 -cpu mips-p8700 \ -m 2G -M boston-aia \ -smp 8,cores=3D4,threads=3D2 -kernel fw_payload.bin \ -drive file=3Drootfs.ext2,format=3Draw -serial stdio Signed-off-by: Chao-ying Fu Signed-off-by: Djordje Todorovic Acked-by: Daniel Henrique Barboza --- configs/devices/riscv64-softmmu/default.mak | 1 + docs/system/riscv/mips.rst | 20 + docs/system/target-riscv.rst | 1 + hw/riscv/Kconfig | 6 + hw/riscv/boston-aia.c | 472 ++++++++++++++++++++ hw/riscv/meson.build | 1 + 6 files changed, 501 insertions(+) create mode 100644 docs/system/riscv/mips.rst create mode 100644 hw/riscv/boston-aia.c diff --git a/configs/devices/riscv64-softmmu/default.mak b/configs/devices/= riscv64-softmmu/default.mak index e485bbd1a3..a8e4d0ab33 100644 --- a/configs/devices/riscv64-softmmu/default.mak +++ b/configs/devices/riscv64-softmmu/default.mak @@ -12,3 +12,4 @@ # CONFIG_MICROCHIP_PFSOC=3Dn # CONFIG_SHAKTI_C=3Dn # CONFIG_XIANGSHAN_KUNMINGHU=3Dn +# CONFIG_MIPS_BOSTON_AIA=3Dn diff --git a/docs/system/riscv/mips.rst b/docs/system/riscv/mips.rst new file mode 100644 index 0000000000..97096421e1 --- /dev/null +++ b/docs/system/riscv/mips.rst @@ -0,0 +1,20 @@ +Boards for RISC-V Processors by MIPS +=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 + +RISC-V processors developed by MIPS support Boston-aia board model. The bo= ard +model supports up to 64 harts with MIPS CPS, MIPS GCR, MIPS CPC, AIA plic, +and AIA clint devices. The model can create boot code, if there is no +```-bios``` parameter. Also, we can specify ```-smp x,cores=3Dy,thread=3Dz= ```. + +Running Linux kernel +-------------------- + +For example, to use 4 cores and 2 threads with each core to have 8 smp cpu= s, +that runs on the ```mips-p8700``` CPU, run qemu as follows: + +.. code-block:: bash + + qemu-system-riscv64 -cpu mips-p8700 \ + -m 2G -M boston-aia \ + -smp 8,cores=3D4,threads=3D2 -kernel fw_payload.bin \ + -drive file=3Drootfs.ext2,format=3Draw -serial stdio diff --git a/docs/system/target-riscv.rst b/docs/system/target-riscv.rst index 89b2cb732c..3ad5d1ddaf 100644 --- a/docs/system/target-riscv.rst +++ b/docs/system/target-riscv.rst @@ -68,6 +68,7 @@ undocumented; you can get a complete list by running =20 riscv/microblaze-v-generic riscv/microchip-icicle-kit + riscv/mips riscv/shakti-c riscv/sifive_u riscv/virt diff --git a/hw/riscv/Kconfig b/hw/riscv/Kconfig index fc9c35bd98..0222c93f87 100644 --- a/hw/riscv/Kconfig +++ b/hw/riscv/Kconfig @@ -128,3 +128,9 @@ config XIANGSHAN_KUNMINGHU select RISCV_APLIC select RISCV_IMSIC select SERIAL_MM + +config MIPS_BOSTON_AIA + bool + default y + select PCI_EXPRESS + select PCI_EXPRESS_XILINX diff --git a/hw/riscv/boston-aia.c b/hw/riscv/boston-aia.c new file mode 100644 index 0000000000..f7c4bd0f85 --- /dev/null +++ b/hw/riscv/boston-aia.c @@ -0,0 +1,472 @@ +/* + * MIPS Boston-aia development board emulation. + * + * Copyright (c) 2016 Imagination Technologies + * + * Copyright (c) 2025 MIPS + * + * SPDX-License-Identifier: GPL-2.0-or-later + * + */ + +#include "qemu/osdep.h" +#include "qemu/units.h" + +#include "hw/boards.h" +#include "hw/char/serial-mm.h" +#include "hw/ide/pci.h" +#include "hw/ide/ahci-pci.h" +#include "hw/loader.h" +#include "hw/riscv/cps.h" +#include "hw/pci-host/xilinx-pcie.h" +#include "hw/qdev-properties.h" +#include "qapi/error.h" +#include "qemu/error-report.h" +#include "qemu/log.h" +#include "chardev/char.h" +#include "system/address-spaces.h" +#include "system/device_tree.h" +#include "system/system.h" +#include "system/qtest.h" +#include "system/runstate.h" + +#include +#include "qom/object.h" + +#define TYPE_MIPS_BOSTON_AIA "mips-boston-aia" +typedef struct BostonState BostonState; +DECLARE_INSTANCE_CHECKER(BostonState, BOSTON, + TYPE_MIPS_BOSTON_AIA) + +enum { + BOSTON_PCIE2, + BOSTON_PCIE2_MMIO, + BOSTON_PLATREG, + BOSTON_UART, + BOSTON_LCD, + BOSTON_FLASH, + BOSTON_HIGHDDR, +}; + +static const MemMapEntry boston_memmap[] =3D { + [BOSTON_PCIE2] =3D { 0x14000000, 0x2000000 }, + [BOSTON_PCIE2_MMIO] =3D { 0x16000000, 0x100000 }, + [BOSTON_PLATREG] =3D { 0x17ffd000, 0x1000 }, + [BOSTON_UART] =3D { 0x17ffe000, 0x20 }, + [BOSTON_LCD] =3D { 0x17fff000, 0x8 }, + [BOSTON_FLASH] =3D { 0x18000000, 0x8000000 }, + [BOSTON_HIGHDDR] =3D { 0x80000000, 0x0 }, +}; + +/* Interrupt numbers for APLIC. */ +#define UART_INT 4 +#define PCIE2_INT 7 + +struct BostonState { + SysBusDevice parent_obj; + + MachineState *mach; + RISCVCPSState cps; + SerialMM *uart; + + CharBackend lcd_display; + char lcd_content[8]; + bool lcd_inited; +}; + +enum boston_plat_reg { + PLAT_FPGA_BUILD =3D 0x00, + PLAT_CORE_CL =3D 0x04, + PLAT_WRAPPER_CL =3D 0x08, + PLAT_SYSCLK_STATUS =3D 0x0c, + PLAT_SOFTRST_CTL =3D 0x10, +#define PLAT_SOFTRST_CTL_SYSRESET (1 << 4) + PLAT_DDR3_STATUS =3D 0x14, +#define PLAT_DDR3_STATUS_LOCKED (1 << 0) +#define PLAT_DDR3_STATUS_CALIBRATED (1 << 2) +#define PLAT_DDR3_INTERFACE_RESET (1 << 3) + PLAT_PCIE_STATUS =3D 0x18, +#define PLAT_PCIE_STATUS_PCIE0_LOCKED (1 << 0) +#define PLAT_PCIE_STATUS_PCIE1_LOCKED (1 << 8) +#define PLAT_PCIE_STATUS_PCIE2_LOCKED (1 << 16) + PLAT_FLASH_CTL =3D 0x1c, + PLAT_SPARE0 =3D 0x20, + PLAT_SPARE1 =3D 0x24, + PLAT_SPARE2 =3D 0x28, + PLAT_SPARE3 =3D 0x2c, + PLAT_MMCM_DIV =3D 0x30, +#define PLAT_MMCM_DIV_CLK0DIV_SHIFT 0 +#define PLAT_MMCM_DIV_INPUT_SHIFT 8 +#define PLAT_MMCM_DIV_MUL_SHIFT 16 +#define PLAT_MMCM_DIV_CLK1DIV_SHIFT 24 + PLAT_BUILD_CFG =3D 0x34, +#define PLAT_BUILD_CFG_IOCU_EN (1 << 0) +#define PLAT_BUILD_CFG_PCIE0_EN (1 << 1) +#define PLAT_BUILD_CFG_PCIE1_EN (1 << 2) +#define PLAT_BUILD_CFG_PCIE2_EN (1 << 3) + PLAT_DDR_CFG =3D 0x38, +#define PLAT_DDR_CFG_SIZE (0xf << 0) +#define PLAT_DDR_CFG_MHZ (0xfff << 4) + PLAT_NOC_PCIE0_ADDR =3D 0x3c, + PLAT_NOC_PCIE1_ADDR =3D 0x40, + PLAT_NOC_PCIE2_ADDR =3D 0x44, + PLAT_SYS_CTL =3D 0x48, +}; + +static void boston_lcd_event(void *opaque, QEMUChrEvent event) +{ + BostonState *s =3D opaque; + if (event =3D=3D CHR_EVENT_OPENED && !s->lcd_inited) { + qemu_chr_fe_printf(&s->lcd_display, " "); + s->lcd_inited =3D true; + } +} + +static uint64_t boston_lcd_read(void *opaque, hwaddr addr, + unsigned size) +{ + BostonState *s =3D opaque; + uint64_t val =3D 0; + + switch (size) { + case 8: + val |=3D (uint64_t)s->lcd_content[(addr + 7) & 0x7] << 56; + val |=3D (uint64_t)s->lcd_content[(addr + 6) & 0x7] << 48; + val |=3D (uint64_t)s->lcd_content[(addr + 5) & 0x7] << 40; + val |=3D (uint64_t)s->lcd_content[(addr + 4) & 0x7] << 32; + /* fall through */ + case 4: + val |=3D (uint64_t)s->lcd_content[(addr + 3) & 0x7] << 24; + val |=3D (uint64_t)s->lcd_content[(addr + 2) & 0x7] << 16; + /* fall through */ + case 2: + val |=3D (uint64_t)s->lcd_content[(addr + 1) & 0x7] << 8; + /* fall through */ + case 1: + val |=3D (uint64_t)s->lcd_content[(addr + 0) & 0x7]; + break; + } + + return val; +} + +static void boston_lcd_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + BostonState *s =3D opaque; + + switch (size) { + case 8: + s->lcd_content[(addr + 7) & 0x7] =3D val >> 56; + s->lcd_content[(addr + 6) & 0x7] =3D val >> 48; + s->lcd_content[(addr + 5) & 0x7] =3D val >> 40; + s->lcd_content[(addr + 4) & 0x7] =3D val >> 32; + /* fall through */ + case 4: + s->lcd_content[(addr + 3) & 0x7] =3D val >> 24; + s->lcd_content[(addr + 2) & 0x7] =3D val >> 16; + /* fall through */ + case 2: + s->lcd_content[(addr + 1) & 0x7] =3D val >> 8; + /* fall through */ + case 1: + s->lcd_content[(addr + 0) & 0x7] =3D val; + break; + } + + qemu_chr_fe_printf(&s->lcd_display, + "\r%-8.8s", s->lcd_content); +} + +static const MemoryRegionOps boston_lcd_ops =3D { + .read =3D boston_lcd_read, + .write =3D boston_lcd_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, +}; + +static uint64_t boston_platreg_read(void *opaque, hwaddr addr, + unsigned size) +{ + BostonState *s =3D opaque; + uint32_t gic_freq, val; + + if (size !=3D 4) { + qemu_log_mask(LOG_UNIMP, "%uB platform register read\n", size); + return 0; + } + + switch (addr & 0xffff) { + case PLAT_FPGA_BUILD: + case PLAT_CORE_CL: + case PLAT_WRAPPER_CL: + return 0; + case PLAT_DDR3_STATUS: + return PLAT_DDR3_STATUS_LOCKED | PLAT_DDR3_STATUS_CALIBRATED + | PLAT_DDR3_INTERFACE_RESET; + case PLAT_MMCM_DIV: + gic_freq =3D 25000000 / 1000000; + val =3D gic_freq << PLAT_MMCM_DIV_INPUT_SHIFT; + val |=3D 1 << PLAT_MMCM_DIV_MUL_SHIFT; + val |=3D 1 << PLAT_MMCM_DIV_CLK0DIV_SHIFT; + val |=3D 1 << PLAT_MMCM_DIV_CLK1DIV_SHIFT; + return val; + case PLAT_BUILD_CFG: + val =3D PLAT_BUILD_CFG_PCIE0_EN; + val |=3D PLAT_BUILD_CFG_PCIE1_EN; + val |=3D PLAT_BUILD_CFG_PCIE2_EN; + return val; + case PLAT_DDR_CFG: + val =3D s->mach->ram_size / GiB; + assert(!(val & ~PLAT_DDR_CFG_SIZE)); + val |=3D PLAT_DDR_CFG_MHZ; + return val; + default: + qemu_log_mask(LOG_UNIMP, "Read platform register 0x%" HWADDR_PRIx = "\n", + addr & 0xffff); + return 0; + } +} + +static void boston_platreg_write(void *opaque, hwaddr addr, + uint64_t val, unsigned size) +{ + if (size !=3D 4) { + qemu_log_mask(LOG_UNIMP, "%uB platform register write\n", size); + return; + } + + switch (addr & 0xffff) { + case PLAT_FPGA_BUILD: + case PLAT_CORE_CL: + case PLAT_WRAPPER_CL: + case PLAT_DDR3_STATUS: + case PLAT_PCIE_STATUS: + case PLAT_MMCM_DIV: + case PLAT_BUILD_CFG: + case PLAT_DDR_CFG: + /* read only */ + break; + case PLAT_SOFTRST_CTL: + if (val & PLAT_SOFTRST_CTL_SYSRESET) { + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); + } + break; + default: + qemu_log_mask(LOG_UNIMP, "Write platform register 0x%" HWADDR_PRIx + " =3D 0x%" PRIx64 "\n", addr & 0xffff, val); + break; + } +} + +static const MemoryRegionOps boston_platreg_ops =3D { + .read =3D boston_platreg_read, + .write =3D boston_platreg_write, + .endianness =3D DEVICE_NATIVE_ENDIAN, +}; + +static const TypeInfo boston_device =3D { + .name =3D TYPE_MIPS_BOSTON_AIA, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(BostonState), +}; + +static void boston_register_types(void) +{ + type_register_static(&boston_device); +} +type_init(boston_register_types) + +#define NUM_INSNS 6 +static void gen_firmware(uint32_t *p) +{ + int i; + uint32_t reset_vec[NUM_INSNS] =3D { + /* CM relocate */ + 0x1fb802b7, /* li t0,0x1fb80000 */ + 0x16100337, /* li t1,0x16100000 */ + 0x0062b423, /* sd t1,8(t0) */ + /* Jump to 0x80000000 */ + 0x00100293, /* li t0,1 */ + 0x01f29293, /* slli t0,t0,1f */ + 0x00028067 /* jr t0 */ + }; + + for (i =3D 0; i < NUM_INSNS; i++) { + *p++ =3D reset_vec[i]; + } +} + +static inline XilinxPCIEHost * +xilinx_pcie_init(MemoryRegion *sys_mem, uint32_t bus_nr, + hwaddr cfg_base, uint64_t cfg_size, + hwaddr mmio_base, uint64_t mmio_size, + qemu_irq irq) +{ + DeviceState *dev; + MemoryRegion *cfg, *mmio; + + dev =3D qdev_new(TYPE_XILINX_PCIE_HOST); + + qdev_prop_set_uint32(dev, "bus_nr", bus_nr); + qdev_prop_set_uint64(dev, "cfg_base", cfg_base); + qdev_prop_set_uint64(dev, "cfg_size", cfg_size); + qdev_prop_set_uint64(dev, "mmio_base", mmio_base); + qdev_prop_set_uint64(dev, "mmio_size", mmio_size); + + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + + cfg =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0); + memory_region_add_subregion_overlap(sys_mem, cfg_base, cfg, 0); + + mmio =3D sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1); + memory_region_add_subregion_overlap(sys_mem, 0, mmio, 0); + + qdev_connect_gpio_out_named(dev, "interrupt_out", 0, irq); + + return XILINX_PCIE_HOST(dev); +} + +static void boston_mach_init(MachineState *machine) +{ + DeviceState *dev; + BostonState *s; + MemoryRegion *flash, *ddr_low_alias, *lcd, *platreg; + MemoryRegion *sys_mem =3D get_system_memory(); + XilinxPCIEHost *pcie2; + PCIDevice *pdev; + AHCIPCIState *ich9; + DriveInfo *hd[6]; + Chardev *chr; + int fw_size; + + if ((machine->ram_size % GiB) || + (machine->ram_size > (4 * GiB))) { + error_report("Memory size must be 1GB, 2GB, 3GB, or 4GB"); + exit(1); + } + + if (machine->smp.cpus / machine->smp.cores / machine->smp.threads > 1)= { + error_report( + "Invalid -smp x,cores=3Dy,threads=3Dz. The max number of clust= ers " + "supported is 1"); + exit(1); + } + + dev =3D qdev_new(TYPE_MIPS_BOSTON_AIA); + sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal); + + s =3D BOSTON(dev); + s->mach =3D machine; + + object_initialize_child(OBJECT(machine), "cps", &s->cps, TYPE_RISCV_CP= S); + object_property_set_str(OBJECT(&s->cps), "cpu-type", machine->cpu_type, + &error_fatal); + object_property_set_uint(OBJECT(&s->cps), "num-vp", machine->smp.cpus, + &error_fatal); + object_property_set_uint(OBJECT(&s->cps), "num-hart", machine->smp.thr= eads, + &error_fatal); + object_property_set_uint(OBJECT(&s->cps), "num-core", machine->smp.cor= es, + &error_fatal); + object_property_set_uint(OBJECT(&s->cps), "gcr-base", GCR_BASE_ADDR, + &error_fatal); + sysbus_realize(SYS_BUS_DEVICE(&s->cps), &error_fatal); + + sysbus_mmio_map_overlap(SYS_BUS_DEVICE(&s->cps), 0, 0, 1); + + flash =3D g_new(MemoryRegion, 1); + memory_region_init_rom(flash, NULL, "boston.flash", + boston_memmap[BOSTON_FLASH].size, &error_fatal); + memory_region_add_subregion_overlap(sys_mem, + boston_memmap[BOSTON_FLASH].base, + flash, 0); + + memory_region_add_subregion_overlap(sys_mem, + boston_memmap[BOSTON_HIGHDDR].base, + machine->ram, 0); + + ddr_low_alias =3D g_new(MemoryRegion, 1); + memory_region_init_alias(ddr_low_alias, NULL, "boston_low.ddr", + machine->ram, 0, + MIN(machine->ram_size, (256 * MiB))); + memory_region_add_subregion_overlap(sys_mem, 0, ddr_low_alias, 0); + + pcie2 =3D xilinx_pcie_init(sys_mem, 2, + boston_memmap[BOSTON_PCIE2].base, + boston_memmap[BOSTON_PCIE2].size, + boston_memmap[BOSTON_PCIE2_MMIO].base, + boston_memmap[BOSTON_PCIE2_MMIO].size, + qdev_get_gpio_in(s->cps.aplic, PCIE2_INT)); + + platreg =3D g_new(MemoryRegion, 1); + memory_region_init_io(platreg, NULL, &boston_platreg_ops, s, + "boston-platregs", + boston_memmap[BOSTON_PLATREG].size); + memory_region_add_subregion_overlap(sys_mem, + boston_memmap[BOSTON_PLATREG].base, platreg, 0); + + s->uart =3D serial_mm_init(sys_mem, boston_memmap[BOSTON_UART].base, 2, + qdev_get_gpio_in(s->cps.aplic, UART_INT), 100= 00000, + serial_hd(0), DEVICE_NATIVE_ENDIAN); + + lcd =3D g_new(MemoryRegion, 1); + memory_region_init_io(lcd, NULL, &boston_lcd_ops, s, "boston-lcd", 0x8= ); + memory_region_add_subregion_overlap(sys_mem, + boston_memmap[BOSTON_LCD].base, lc= d, 0); + + chr =3D qemu_chr_new("lcd", "vc:320x240", NULL); + qemu_chr_fe_init(&s->lcd_display, chr, NULL); + qemu_chr_fe_set_handlers(&s->lcd_display, NULL, NULL, + boston_lcd_event, NULL, s, NULL, true); + + pdev =3D pci_create_simple_multifunction(&PCI_BRIDGE(&pcie2->root)->se= c_bus, + PCI_DEVFN(0, 0), TYPE_ICH9_AHCI= ); + ich9 =3D ICH9_AHCI(pdev); + g_assert(ARRAY_SIZE(hd) =3D=3D ich9->ahci.ports); + ide_drive_get(hd, ich9->ahci.ports); + ahci_ide_create_devs(&ich9->ahci, hd); + + if (machine->firmware) { + fw_size =3D load_image_targphys(machine->firmware, + 0x1fc00000, 4 * MiB); + if (fw_size =3D=3D -1) { + error_report("unable to load firmware image '%s'", + machine->firmware); + exit(1); + } + if (machine->kernel_filename) { + fw_size =3D load_image_targphys(machine->kernel_filename, + 0x80000000, 64 * MiB); + if (fw_size =3D=3D -1) { + error_report("unable to load kernel image '%s'", + machine->kernel_filename); + exit(1); + } + } + } else if (machine->kernel_filename) { + fw_size =3D load_image_targphys(machine->kernel_filename, + 0x80000000, 64 * MiB); + if (fw_size =3D=3D -1) { + error_report("unable to load kernel image '%s'", + machine->kernel_filename); + exit(1); + } + + gen_firmware(memory_region_get_ram_ptr(flash) + 0x7c00000); + } else if (!qtest_enabled()) { + error_report("Please provide either a -kernel or -bios argument"); + exit(1); + } +} + +static void boston_mach_class_init(MachineClass *mc) +{ + mc->desc =3D "MIPS Boston-aia"; + mc->init =3D boston_mach_init; + mc->block_default_type =3D IF_IDE; + mc->default_ram_size =3D 2 * GiB; + mc->default_ram_id =3D "boston.ddr"; + mc->max_cpus =3D MAX_HARTS; + mc->default_cpu_type =3D TYPE_RISCV_CPU_MIPS_P8700; +} + +DEFINE_MACHINE("boston-aia", boston_mach_class_init) diff --git a/hw/riscv/meson.build b/hw/riscv/meson.build index 945ba20612..90cd5acec9 100644 --- a/hw/riscv/meson.build +++ b/hw/riscv/meson.build @@ -16,5 +16,6 @@ riscv_ss.add(when: 'CONFIG_MICROBLAZE_V', if_true: files(= 'microblaze-v-generic.c riscv_ss.add(when: 'CONFIG_XIANGSHAN_KUNMINGHU', if_true: files('xiangshan= _kmh.c')) =20 riscv_ss.add(when: 'CONFIG_RISCV_CPS', if_true: files('cps.c')) +riscv_ss.add(when: 'CONFIG_MIPS_BOSTON_AIA', if_true: files('boston-aia.c'= )) =20 hw_arch +=3D {'riscv': riscv_ss} --=20 2.34.1