From nobody Tue Nov 4 18:32:08 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail header.i=@wdc.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1530636372042458.1177445607807; Tue, 3 Jul 2018 09:46:12 -0700 (PDT) Received: from localhost ([::1]:41692 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1faORP-0008Ox-0A for importer@patchew.org; Tue, 03 Jul 2018 12:46:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49758) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1faOGl-00084c-9R for qemu-devel@nongnu.org; Tue, 03 Jul 2018 12:35:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1faOGh-0005kQ-Di for qemu-devel@nongnu.org; Tue, 03 Jul 2018 12:35:11 -0400 Received: from esa6.hgst.iphmx.com ([216.71.154.45]:62998) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1faOGg-0005ir-W9 for qemu-devel@nongnu.org; Tue, 03 Jul 2018 12:35:07 -0400 Received: from mail-co1nam04lp0047.outbound.protection.outlook.com (HELO NAM04-CO1-obe.outbound.protection.outlook.com) ([216.32.181.47]) by ob1.hgst.iphmx.com with ESMTP; 04 Jul 2018 00:35:04 +0800 Received: from risc6-mainframe.int.fusionio.com (199.255.44.171) by BN6PR04MB0387.namprd04.prod.outlook.com (2603:10b6:404:91::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.906.24; Tue, 3 Jul 2018 16:34:59 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1530635708; x=1562171708; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=QWL4sg+r8fWzmU9vqIsxhgM+Zr3dXrL5AYq6SnOvmdg=; b=Dp/j5mZ+V2d6mCB0UvsvzIDxy/mp9pps+mVUppzZYFCiWhnO34MKUZJa OA9nwIvHOKMrAM8JXMLsXEBkgzybw4Pq4gkQeg0Wa1Wzmt+NKwQNtYYeR f3lDFYftJg0wwNxsAM4UXsPm5St26uWaPXgWYxep0PJo6SVOgw9YR2nO4 nG4g7IXgUPsgdLCHoRaJzKx5AeUuO2Nt6n3W2nvjXi/dFiq9FxGulhleP VBhVHDgfMIFS8KPtWJqwoNKnEcVag9lCf2Qwmsa9nsvLIF3wny+i4iA4I uYd6KQ6IToKq3Wzd7Gz+nUITmOKill8WREfkMQjgt4woAn0ln7C/1SMjT Q==; X-IronPort-AV: E=Sophos;i="5.51,304,1526313600"; d="scan'208";a="84260489" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sharedspace.onmicrosoft.com; s=selector1-wdc-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=iugC6atpqNXUgJ3fkZK/Wb6KKkWCQNtCqQ1n8ExRzaY=; b=FWOK8J0/ekSUVYCcQLlhWiiVBq1T+XBg6GrXubIPilMYGgLlAoBOxWBBNy3JeJZ8ZY8UGH6wf66t6e8K2paim2mKZElMtYDq3Y2xmu5y7esEEAw2/kQk1BmR5DF2Dlpzd83Nr3hc1kuU0/zeMq9sEnkrslUKhNTtBl0XFycBweI= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alistair.Francis@wdc.com; From: Alistair Francis To: qemu-devel@nongnu.org, peter.maydell@linaro.org, mjc@sifive.com Date: Tue, 3 Jul 2018 09:34:40 -0700 Message-Id: <20180703163446.9943-2-alistair.francis@wdc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180703163446.9943-1-alistair.francis@wdc.com> References: <20180703163446.9943-1-alistair.francis@wdc.com> MIME-Version: 1.0 X-Originating-IP: [199.255.44.171] X-ClientProxiedBy: CO2PR04CA0095.namprd04.prod.outlook.com (2603:10b6:104:6::21) To BN6PR04MB0387.namprd04.prod.outlook.com (2603:10b6:404:91::16) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5246017c-1509-4b97-f97c-08d5e102ebd7 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989117)(5600053)(711020)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(2017052603328)(7153060)(7193020); SRVR:BN6PR04MB0387; X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0387; 3:vTiaCE6ms3pFXyjwzEsXosJlXxTGOfyCFhHi8m3UW/7KTSiQZFs85WNz2BChAjhd2yAiFaifCsR5VZ8Vsv7SYK5+pvkr12UFfjTKUo1xZ2L8xXJDfJsnalnhL4+16M91lcs+l0LIJLsl8w8uMlynhJoEHp3HdeTw9h//ex5ocft5ltVS1YBMEyZiRPIQMaFQFvJVjZtg6sR8LVWcQiocLsSooVI5NgcDyo5/MERmyRZaakRqXJdxpL/8ccz0kd79; 25:JM+FmZBUZMtnbiBO50cINxgxzsIBJX0qSgK2KuSlcSKXxLZAlHT88EO1acTkzhHEmF7h3nFuZaHs2Oy4B9oP1Sjax8+GVmj+214yDWhkQZZRqWGX4FCEdILlbnfQZ+ZKCjB8RrpMvCV47YJnuhn+SHeH2BLimqA8jghkrO+ehdi7EdIxPD/ch3j94AAtQOenQDzT0AatgEfM3dgGXVDBTGfR3dP2qoHek48Fyxb9AYccoqFVk7d4KcZ/U4MukDh46W6v12VWPI1R0JjW3LezQENzGtiDZJWaCZaPH4NUGfGPYpEExXT/07JOv8MWI3YWIjFuxh+/wUHk1ccTa3nwYw==; 31:xs7ZTmYUK/d+PU7idjZwW9DA98y24k6HREwMMdcGb2AeGG1dfyEXs5jILN/mqOJJfEA2ibCuq4+l/mYFEEC4GczDmwD9sAQ8A0c5iENvS2rUQGTSXAgVwAdu0NEjTVFpbaKuZ9EN8lUrX16iNOkGC0e7GQanSDOC9/NcA7d9oyy5qQtbia/fpEaJbBQHj6+55ZGCYQ9GOjFj+djpX32Gdly1/OsXxFE3WuUa/F7H3+8= X-MS-TrafficTypeDiagnostic: BN6PR04MB0387: WDCIPOUTBOUND: EOP-TRUE X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0387; 20:pRyOHnVgqErz02eXsy9AD8RIDDZ2R8A+YVrUKa39OUPDVu08jTs1FoN646viAwVFQhe+sZ4l4rKY2R3RsfBfzX7VuUx7t9OirXr2nLjWlA2N4OSLMe6Wflhi25eSO+bRAr8Q8BI37dgJzaET3RgE+oPoVJlGZQKJ5oj+RH/av3ygj9/+bCWpQI0r4/mhOvu4qyLXjgcloGSgUNLLvdyI4wq5AZWZvbjl3HMJvaT7Id4k4XXkUdOqW1PHgPKZmNKWgPvnKGiI/YhL5yzqwA4CZgNrUWKjkwLhxdMlGxAssWRTgPDKz0RNX/Vmqg6iL/4t14MtdSnRbvcfzgFewvYQPlwkq1zUbBxjQxaLBmewvBC5aWUg2YTInlpqH2qZrQ+t9PZS8p1+opIvYH1q9yDylymsbxQR2ZIh/w2eyaFMnbasOOIb77SDa9g0AN+qq898m+YponRe0AxLqsK9myT9XNeN0ZtO16kh8QCXUnz8Y0tSUGrBf691qKZfJpmn74CF; 4:yJxnUDFEUcvKsGhCrQNbeAtSH5tM9ugLUWbWY+89pa1qMS+rTf2OxhAYboMdCDyMNubhq6ErHdL6ijY9HBsY5dzFVatL64dbN9BF4gTrs2fS+5uzB28pVk9OHTGmBLHDj8lqEUaNcSi13ABWLkcl8+Qx8YNrLlxGMWervYe9HbUX34hIh0mB68DTOxO9T1E5Dd26c9ptmivRk0H7z+es6L/WaU8qGMMF7YX2VPjessJjTYg6nUqrVL6L574qScfaMNwq7jwc9W7pOlF9Cj51KQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040522)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93001095)(3231254)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123558120)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:BN6PR04MB0387; BCL:0; PCL:0; RULEID:; SRVR:BN6PR04MB0387; X-Forefront-PRVS: 0722981D2A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6029001)(346002)(39860400002)(366004)(376002)(136003)(396003)(199004)(189003)(44832011)(50466002)(48376002)(39060400002)(446003)(956004)(476003)(36756003)(6116002)(25786009)(5660300001)(53936002)(86362001)(3846002)(7736002)(486006)(50226002)(316002)(68736007)(16586007)(2616005)(6512007)(6486002)(11346002)(305945005)(4326008)(8936002)(1076002)(16526019)(26005)(106356001)(186003)(81166006)(8676002)(47776003)(81156014)(66066001)(6666003)(97736004)(51416003)(6506007)(52116002)(2906002)(76176011)(386003)(72206003)(478600001)(105586002); DIR:OUT; SFP:1102; SCL:1; SRVR:BN6PR04MB0387; H:risc6-mainframe.int.fusionio.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR04MB0387; 23:hKbw9lWh7k7QfCKusCduEZH/Z/TBMHgOUvPCrRnJG?= =?us-ascii?Q?uSr4zhV3m2+I+jSjGi9Caui0CEev6y9NRX6+0ZL95kKg8VDNDafH5U0lKq2Z?= =?us-ascii?Q?G+HBkQo/wRZkFZvZXll97SZP7zgOpk1PQdNNzmdCIbRKkC4IYNtlqbPgqaJf?= =?us-ascii?Q?wRz6zh3r7OoIFKNqwKcq32zd7M4hAZSE2GpQ4t4ijBP4E6e6Auzq3N4lCBqc?= =?us-ascii?Q?1Tqs8RuuxtW+EZsU8AB820tiigCgycfgGhVNNUf9CbwL79JFki1gqbJPRvz5?= =?us-ascii?Q?fU8HGmgJj6MW0mX5R+sFsJNSgkH1swNaROtROFuDE7FiBHP0mCoyq9O28n3K?= =?us-ascii?Q?6vxFCN+8LvVJx7sJZm8spLmYD6LWzsctrGvG5GSJI8HZLdk14/qXLD8CyqsW?= =?us-ascii?Q?mOCJdXqjH3RKsjyeb6URCpgwEuTn+j/uvDKs++TDhzIXdoj9kCjlbrhyhlY5?= =?us-ascii?Q?Sm5aAtYvm+6BdzlPMOLxHNLz9hmCvZTx2BckiPWddupThPtwRXyDsu4tWao9?= =?us-ascii?Q?HjycWhh3MvGhtazdSm3Ngm2bUhzS6QezsvEUfIF36FWLdxU4MhJq+WdSLJsa?= =?us-ascii?Q?gDh+VX2hBb//Z+YnHo9UtaOmHUJmZNJnC6i7Mtgvg1Qc417N99fBDgtcXj6S?= =?us-ascii?Q?24h2VQnc158H2oxZVfM6RBvyQBt1gmEM73dSjPbgWILmJJVUHBRbHtJ7q3eE?= =?us-ascii?Q?7bQ4pVk4j5K+xOPcG/NmdwVuXqh+vHWQg64WG4LUgBBKD+MjmsVXdkv+qYcM?= =?us-ascii?Q?s2bf9Ud5WRHSEZ6qt6rgZCzUkvYT/bTfc5sfmfSCF6JMKxBbGxO/FTojpSrp?= =?us-ascii?Q?00DtPlLfr6lzgjXBHYRM+joICwonLXyPGl+RVV3a1mPzgJm+revruKdBuOo7?= =?us-ascii?Q?p9bbHjDUOO+nIpJuRI0wDdl8DWlqT89MRRZ8JUgBj/IhC4Ph2cAsSz3llMWT?= =?us-ascii?Q?TnKsDtUCAnGUtXYmlMkgBy02SWAG3Syi8l6X8JoTI1RPqfQF/Pz/GAmN2Hte?= =?us-ascii?Q?9zayijh65GX6ObfmPsz+cno463Eum+N17Vm6E8xqmqRn452uVgXE2bf0v0Xx?= =?us-ascii?Q?NtZlKn8SO2Ykm8a0bY6BVOjE8zpilltDRfitaXF6xpjtjw/asssTLxhYxBTX?= =?us-ascii?Q?YyCKpP2XQANmMNbpykPfxqmZ6wGAE2w6JF+NhTCG9Cp7nBGeyTnNVwqQPWLg?= =?us-ascii?Q?TRr+/hd+WqktvuZL0N3SeAjkxkXkij1AdB3A72bv+1URYz+vmgA7FKpTWqAk?= =?us-ascii?Q?mmUw9tJ2FOEVrYm9hg=3D?= X-Microsoft-Antispam-Message-Info: 3k+zlPH8TskNxi49Ev+8wRgf1cOB1pqxDzSzsFAwZGYBykU87w4lFFAkGAaF5+A7MdaTbzPsCwOV0KjUdnu9hBSdTcEG0MYFCDc9SKtH5JF6OuE8GJCihpe5NRwziud4LCK9b40+WeNfMHDdMYamNB9iyABYxPLWiE+MD9XDNPpvn7rdvVQVIytoqEaowKu/MbSWWlWiHPghcKi9jRxipF6ZhyLQKGH0Ofh6P46Geg2C/JuPl3QTvMm5068a7ewn2wBrNQwqwnP2PANxGQvlUtdNe9x0JiPQVOAxAiCptcBrxaV4xbwMDeY3ZwRqL3jWSUktiHc16FBjdOubVln6vJjjk/Gv2KVFbbtSX6FTjac= X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0387; 6:bqX4vylSMvzPXUesh+cMYnRsqcaw17GJIF+6MW7AWAGPSv2gi+JX5Jo6JoNMII0cOBI7a59j+4ws9CqO54r5bFa6MqtfhAtrk6MxSfXoSEersepR5Dh2lyA6WZC9AADxh9QCKzfo60NF/Q8oGCulxk6PnWq/mYUOCvSbFkPd1EWJL5hELXKy1jOm9bHQk+KDtk0VN4wgriy0KGovg8A1aDzbBE3h+uWH2tWxjv8QbkUx2Mr+zaogbrbn+tARcPvVWXOpO6o85AcKadcID43EXRp4kA7rbNqjcTOByngeVb30Jzk/p2RNoeN3KONGIbWb6WAUHZXNvjR9Nb6SOYmTMEaM28MNYZz/CR8jDOINPr6GtykyPDvFyzQ3Dy8zI3t/2DlGslyeBkkx93Kch8SU8nqHfY1XLCk+aKVDN2xDPqzsSWgp28nRQWRXRnHeq8C+uqPsczX3U/7a3klSwGu97w==; 5:MGXZY6RXhqo6KQVwxvkSII3ZH7gQhxxeah+8LZ5NcyjY557y+RHQdvtCo3GCYL7azcLqVt4uLTGCK0DG0WxOeNmHSQgPoEn9MZNsdj6FhXF6llIAUc1O8T10VrdVYzjo4zfSKWmiaA2ehOcJZCcwcD8NiA9LxpvIiESc/bdLAEM=; 24:mTfSNVd3NxTr8wGHMFbgziv76pKGlxpK5iSWCZ8Tajn8Ba/7Q6B3xQW00M/u5+WuFMQvVU+nkia3xvkcoPCvCacoht2S+LUFBVLMvcPpM+w= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0387; 7:/vjvFDiBkSQOK95nxdj79+4vzw6jXIXSHLuHuO4O0fpMPrznVW9xZIqrrn6mrzj3hewu2GaMWKoohxxida9Yo+pvCk9OhGEsg52s4FDSlQfpdVHoUzwdD1HTso41wZ5U8RkioUHV+wpJ7GY9OO3KXWVtvQHAvIbNNHRqC8IqkWQq8bIpo9J3Z3SB0B1Lg/xG63NRSNDdNdaTx6OP85DBJWaY1PIP0B97T59d9B9KdhOAXYG3cAWY0YqovWABy3UO; 20:av2KwT//UF4mx9yS6IF+Z7bE4LjeI3M9koyB0qoSps5jFu3SdHGNbFf+eyNTGf5ri8pG2In7Gt2DaQDmGbJCXJmPCWdua1GkSsU4saJxVje1Yx3QG4Dst8sxe6A8ui/S0wlhTbMg9r93lmNs/2rxbEkMEMNT6dHPwAEGm8OEaxw= X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jul 2018 16:34:59.8070 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5246017c-1509-4b97-f97c-08d5e102ebd7 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR04MB0387 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 216.71.154.45 Subject: [Qemu-devel] [PULL v3 1/7] hw/riscv/sifive_u: Create a SiFive U SoC object X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: alistair23@gmail.com, Alistair Francis , f4bug@amsat.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (found 2 invalid signatures) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Create a SiFive Unleashed U54 SoC and use that in the sifive_u machine. We leave the SoC, RAM, device tree and reset/fdt loading as part of the machine. All the other device creation has been moved to the SoC. Signed-off-by: Alistair Francis Reviewed-by: Michael Clark --- hw/riscv/sifive_u.c | 90 ++++++++++++++++++++++++++++--------- include/hw/riscv/sifive_u.h | 16 ++++++- 2 files changed, 82 insertions(+), 24 deletions(-) diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index c05dcbba95..45b6aeb36b 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -116,10 +116,10 @@ static void create_fdt(SiFiveUState *s, const struct = MemmapEntry *memmap, qemu_fdt_setprop_cell(fdt, "/cpus", "#size-cells", 0x0); qemu_fdt_setprop_cell(fdt, "/cpus", "#address-cells", 0x1); =20 - for (cpu =3D s->soc.num_harts - 1; cpu >=3D 0; cpu--) { + for (cpu =3D s->soc.cpus.num_harts - 1; cpu >=3D 0; cpu--) { nodename =3D g_strdup_printf("/cpus/cpu@%d", cpu); char *intc =3D g_strdup_printf("/cpus/cpu@%d/interrupt-controller"= , cpu); - char *isa =3D riscv_isa_string(&s->soc.harts[cpu]); + char *isa =3D riscv_isa_string(&s->soc.cpus.harts[cpu]); qemu_fdt_add_subnode(fdt, nodename); qemu_fdt_setprop_cell(fdt, nodename, "clock-frequency", SIFIVE_U_CLOCK_FREQ); @@ -140,8 +140,8 @@ static void create_fdt(SiFiveUState *s, const struct Me= mmapEntry *memmap, g_free(nodename); } =20 - cells =3D g_new0(uint32_t, s->soc.num_harts * 4); - for (cpu =3D 0; cpu < s->soc.num_harts; cpu++) { + cells =3D g_new0(uint32_t, s->soc.cpus.num_harts * 4); + for (cpu =3D 0; cpu < s->soc.cpus.num_harts; cpu++) { nodename =3D g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu); uint32_t intc_phandle =3D qemu_fdt_get_phandle(fdt, nodename); @@ -159,12 +159,12 @@ static void create_fdt(SiFiveUState *s, const struct = MemmapEntry *memmap, 0x0, memmap[SIFIVE_U_CLINT].base, 0x0, memmap[SIFIVE_U_CLINT].size); qemu_fdt_setprop(fdt, nodename, "interrupts-extended", - cells, s->soc.num_harts * sizeof(uint32_t) * 4); + cells, s->soc.cpus.num_harts * sizeof(uint32_t) * 4); g_free(cells); g_free(nodename); =20 - cells =3D g_new0(uint32_t, s->soc.num_harts * 4); - for (cpu =3D 0; cpu < s->soc.num_harts; cpu++) { + cells =3D g_new0(uint32_t, s->soc.cpus.num_harts * 4); + for (cpu =3D 0; cpu < s->soc.cpus.num_harts; cpu++) { nodename =3D g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu); uint32_t intc_phandle =3D qemu_fdt_get_phandle(fdt, nodename); @@ -181,7 +181,7 @@ static void create_fdt(SiFiveUState *s, const struct Me= mmapEntry *memmap, qemu_fdt_setprop_string(fdt, nodename, "compatible", "riscv,plic0"); qemu_fdt_setprop(fdt, nodename, "interrupt-controller", NULL, 0); qemu_fdt_setprop(fdt, nodename, "interrupts-extended", - cells, s->soc.num_harts * sizeof(uint32_t) * 4); + cells, s->soc.cpus.num_harts * sizeof(uint32_t) * 4); qemu_fdt_setprop_cells(fdt, nodename, "reg", 0x0, memmap[SIFIVE_U_PLIC].base, 0x0, memmap[SIFIVE_U_PLIC].size); @@ -217,17 +217,12 @@ static void riscv_sifive_u_init(MachineState *machine) SiFiveUState *s =3D g_new0(SiFiveUState, 1); MemoryRegion *system_memory =3D get_system_memory(); MemoryRegion *main_mem =3D g_new(MemoryRegion, 1); - MemoryRegion *mask_rom =3D g_new(MemoryRegion, 1); int i; =20 - /* Initialize SOC */ - object_initialize(&s->soc, sizeof(s->soc), TYPE_RISCV_HART_ARRAY); + /* Initialize SoC */ + object_initialize(&s->soc, sizeof(s->soc), TYPE_RISCV_U_SOC); object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc), &error_abort); - object_property_set_str(OBJECT(&s->soc), SIFIVE_U_CPU, "cpu-type", - &error_abort); - object_property_set_int(OBJECT(&s->soc), smp_cpus, "num-harts", - &error_abort); object_property_set_bool(OBJECT(&s->soc), true, "realized", &error_abort); =20 @@ -235,17 +230,11 @@ static void riscv_sifive_u_init(MachineState *machine) memory_region_init_ram(main_mem, NULL, "riscv.sifive.u.ram", machine->ram_size, &error_fatal); memory_region_add_subregion(system_memory, memmap[SIFIVE_U_DRAM].base, - main_mem); + main_mem); =20 /* create device tree */ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); =20 - /* boot rom */ - memory_region_init_rom(mask_rom, NULL, "riscv.sifive.u.mrom", - memmap[SIFIVE_U_MROM].size, &error_fatal); - memory_region_add_subregion(system_memory, memmap[SIFIVE_U_MROM].base, - mask_rom); - if (machine->kernel_filename) { load_kernel(machine->kernel_filename); } @@ -284,6 +273,39 @@ static void riscv_sifive_u_init(MachineState *machine) rom_add_blob_fixed_as("mrom.fdt", s->fdt, fdt_totalsize(s->fdt), memmap[SIFIVE_U_MROM].base + sizeof(reset_vec), &address_space_memory); +} + +static void riscv_sifive_u_soc_init(Object *obj) +{ + const struct MemmapEntry *memmap =3D sifive_u_memmap; + + SiFiveUSoCState *s =3D RISCV_U_SOC(obj); + MemoryRegion *system_memory =3D get_system_memory(); + MemoryRegion *mask_rom =3D g_new(MemoryRegion, 1); + + object_initialize(&s->cpus, sizeof(s->cpus), TYPE_RISCV_HART_ARRAY); + object_property_add_child(obj, "cpus", OBJECT(&s->cpus), + &error_abort); + object_property_set_str(OBJECT(&s->cpus), SIFIVE_U_CPU, "cpu-type", + &error_abort); + object_property_set_int(OBJECT(&s->cpus), smp_cpus, "num-harts", + &error_abort); + + /* boot rom */ + memory_region_init_rom(mask_rom, NULL, "riscv.sifive.u.mrom", + memmap[SIFIVE_U_MROM].size, &error_fatal); + memory_region_add_subregion(system_memory, memmap[SIFIVE_U_MROM].base, + mask_rom); +} + +static void riscv_sifive_u_soc_realize(DeviceState *dev, Error **errp) +{ + SiFiveUSoCState *s =3D RISCV_U_SOC(dev); + const struct MemmapEntry *memmap =3D sifive_u_memmap; + MemoryRegion *system_memory =3D get_system_memory(); + + object_property_set_bool(OBJECT(&s->cpus), true, "realized", + &error_abort); =20 /* MMIO */ s->plic =3D sifive_plic_create(memmap[SIFIVE_U_PLIC].base, @@ -314,3 +336,27 @@ static void riscv_sifive_u_machine_init(MachineClass *= mc) } =20 DEFINE_MACHINE("sifive_u", riscv_sifive_u_machine_init) + +static void riscv_sifive_u_soc_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(oc); + + dc->realize =3D riscv_sifive_u_soc_realize; + /* Reason: Uses serial_hds in realize function, thus can't be used twi= ce */ + dc->user_creatable =3D false; +} + +static const TypeInfo riscv_sifive_u_soc_type_info =3D { + .name =3D TYPE_RISCV_U_SOC, + .parent =3D TYPE_DEVICE, + .instance_size =3D sizeof(SiFiveUSoCState), + .instance_init =3D riscv_sifive_u_soc_init, + .class_init =3D riscv_sifive_u_soc_class_init, +}; + +static void riscv_sifive_u_soc_register_types(void) +{ + type_register_static(&riscv_sifive_u_soc_type_info); +} + +type_init(riscv_sifive_u_soc_register_types) diff --git a/include/hw/riscv/sifive_u.h b/include/hw/riscv/sifive_u.h index 94a390566e..49f1946539 100644 --- a/include/hw/riscv/sifive_u.h +++ b/include/hw/riscv/sifive_u.h @@ -19,13 +19,25 @@ #ifndef HW_SIFIVE_U_H #define HW_SIFIVE_U_H =20 -typedef struct SiFiveUState { +#define TYPE_RISCV_U_SOC "riscv.sifive.u.soc" +#define RISCV_U_SOC(obj) \ + OBJECT_CHECK(SiFiveUSoCState, (obj), TYPE_RISCV_U_SOC) + +typedef struct SiFiveUSoCState { /*< private >*/ SysBusDevice parent_obj; =20 /*< public >*/ - RISCVHartArrayState soc; + RISCVHartArrayState cpus; DeviceState *plic; +} SiFiveUSoCState; + +typedef struct SiFiveUState { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + SiFiveUSoCState soc; void *fdt; int fdt_size; } SiFiveUState; --=20 2.17.1