From patchwork Tue May 15 00:06:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 10399661 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 593A7600F4 for ; Tue, 15 May 2018 00:09:14 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 13D3427F82 for ; Tue, 15 May 2018 00:09:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 06646285A6; Tue, 15 May 2018 00:09:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1C53327F82 for ; Tue, 15 May 2018 00:09:11 +0000 (UTC) Received: from localhost ([::1]:55816 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fINWh-0003h4-6I for patchwork-qemu-devel@patchwork.kernel.org; Mon, 14 May 2018 20:09:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45246) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fINUl-0002tl-58 for qemu-devel@nongnu.org; Mon, 14 May 2018 20:07:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fINUh-0007Zv-UB for qemu-devel@nongnu.org; Mon, 14 May 2018 20:07:11 -0400 Received: from esa6.hgst.iphmx.com ([216.71.154.45]:23246) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1fINUh-0007UW-Fv for qemu-devel@nongnu.org; Mon, 14 May 2018 20:07:07 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1526342828; x=1557878828; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=4G/avInBHByOe4n0lfkECordr5B3wwdBj+Q3m9YMByg=; b=amJhpJBd+IsM+YHAnMKTVg+R6qdYf0mF0IXNF9FLJfbOuo+d6RFTC60G JBoNDJrDPj63qXA7xY/FWAfWgYKT1UqH3kiBQL1t/l910s/5Ew9m1HKCm X9xCOOSc3z+09aX4C/2pwrb2LtFaszuco8rH7p8fEJa3UlvBTiq6F+WXT N/92mfgBELzm/Q07C9Bu7oAfpXBDa96ZbtplfxGGXkAh0AEzA1XZXfYA8 9Cq2DUs4+A2KjHZCuQHLB9cm1CavP1/wfTvg0arkhAAG0dYEpbgMcJdUG peLnuWWTH8sX3rOfuMJCFQWj9fT4sb1zoX+yqrztlp/93fb0UGhniSH+U Q==; X-IronPort-AV: E=Sophos;i="5.49,402,1520870400"; d="scan'208";a="78815376" Received: from mail-by2nam01lp0178.outbound.protection.outlook.com (HELO NAM01-BY2-obe.outbound.protection.outlook.com) ([216.32.181.178]) by ob1.hgst.iphmx.com with ESMTP; 15 May 2018 08:07:06 +0800 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; bh=YU/9tcKewcEtmYjtzILAkVo8E3f6HVvJf9t0KQXgI1E=; b=a5g9ci1LBAueFsMcnpXE81j6ijD1W36I2M9WeqwesaXWRLNXdP4tHlaZDSGTnOCWqOPs2qOlu6XRzEevdMGIPmiVBENsZKxRuNvZzw16V/40EQjBGmYR5XAkkqtPCAJ71KePIjkrbUsbA+Crd/UMhJVxwsI0OMPNUyv7qdEbIqc= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alistair.Francis@wdc.com; Received: from risc6-mainframe.int.fusionio.com (199.255.44.171) by CY4PR04MB0406.namprd04.prod.outlook.com (2603:10b6:903:b1::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.755.16; Tue, 15 May 2018 00:07:04 +0000 From: Alistair Francis To: qemu-devel@nongnu.org Date: Mon, 14 May 2018 17:06:55 -0700 Message-Id: <87d1ba3e445a9d1f41b6750b29851c8c14ca8572.1526342674.git.alistair.francis@wdc.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: References: MIME-Version: 1.0 X-Originating-IP: [199.255.44.171] X-ClientProxiedBy: BYAPR02CA0016.namprd02.prod.outlook.com (2603:10b6:a02:ee::29) To CY4PR04MB0406.namprd04.prod.outlook.com (2603:10b6:903:b1::19) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(4534165)(4627221)(201703031133081)(201702281549075)(48565401081)(2017052603328)(7153060)(7193020); SRVR:CY4PR04MB0406; X-Microsoft-Exchange-Diagnostics: 1; CY4PR04MB0406; 3:wqK1bWC4ssMAhgfi8VMcEOnQdeH7Av6Qh+dqp0CAulqGDqg2pt/whfa6JWds5DPXvlQT3f3osbEg2+Hs4UouUxt+dPbFFcXqjyxBLHL7Zz/yJ3f+OI3aVdauD/7/WSaLChB5yNT7UQYtkhhk20iPg1e+c73G4HqnBY203bX2dQ3XFq1rYU0Sr+O3kReSZfY/AaRtEnmHHOCl+5r/gjiNlRHODpThY+V2b07i5nIc7bJtAxpYaoD+TJ8YQ5JH05nF; 25:eW2N/8uj3UZ2lxEkIcDQNrZbIdNg3fXP584w6hbmFMW0yUxFsS7H8o6LbQwqnp6rGrfGDzTZkKSfm8gSuEbE7TNmHYsBKm7mj4t+WZoKehZLcnQgEME8AHewhTlYAHRUWjkxnAZyUrbeh2YbP4jahIFd/BeFy/N9tAdj9b0Z/Por30fS4aTrelq256+d/yhw2x/jdxHzlC5xvPyNrbZUZLVXd7XCtiNaxSG+SvGWgFu1aEbv+VYzsgztwLbk26RYPVXf0+TJsKNvxDrQYkUJ4RabFrNqP4glMxtXlCOfA7WMUYQ5XiYJVbrHqOukUtCNxqG+0NIdn3S9G+Qsd7Q+rQ==; 31:7ZqSs4iK8E0zAHaL81DxOksggJ/ljNaa6EnqqJvNeWVHYNrAM9kcsa2WRIgd3vgeK3oRFqQDchirJrjcs0utKOpNQVaAdiXs8PbgBr7clkKGaCRDoyEft3VWhQRTfp/1dofx5Bj6blUdPdC8arOoaB8MrCuajcON+xLBzKKlcB1EBvoFVPeHYkbiVxGjT0boqaUiPlyeSaCQnYIMw1krMFEAqwZ7QKTde01WdUXnUPQ= X-MS-TrafficTypeDiagnostic: CY4PR04MB0406: WDCIPOUTBOUND: EOP-TRUE X-Microsoft-Exchange-Diagnostics: 1; CY4PR04MB0406; 20:vcyejbsst0dn8Sfi2eKx+KefyKaoFctAwCuJ1DyjS2YOjC8U4z1PbJ0PEK452mjNANN2KUXMrFKXheB0gQA3S4zmmV6XNKL2yneW20PdeA18QWIKn01VvcMNAV7r7TE1K8nR0EGuGPdEwksgULDxjlK3o2l7/GfIyhWxhdwvT1qxwucELHk+8ey5J978u/dflByHJF+RqsWpw/i5zTinB0JJaUWldb2d0lXq9/q4kvf9z/WbnuoOVTaXYHOiT3Z9iWLFGWHRH0/vSaQ15ADgd4kZ3tFZ9KiBBZOVcFWfzbyktL9F5va5PUpq7eF253uxuP0zIi8CtLzaC9/7QKYk5B/v8ByAbnxULiN8f9BrNmSWP1hlseNbeVs5H8Mv2P+eWgHi3kq2PROGQUHXRe13iELKawIIT0xGpYDhpZHU7MCjZDPeVfCcfMw2WDuz9VeWUjN8DttrMSguzuBxYUUQqgn+qaWRbADMjWkWM4yAmz259v7fQJX2MJ7sKmmVSDz/; 4:m1Dt3+8DG4aP5dlaGsKZU9BIYNVJ/NS+ri2fiInpPdzzbuYXdc4wsAdTR86A6W/OyyVgb6OAm/qIcjBRz/PnDHm5bOHKq/RDYR+//VQCOjsEBRyWY/bOOrU3GmR72gvrtt+nxC/VbrvUgUbU0oFG5MUtTt9SJ3fiSIiTsRleMyD6KBpeDGHlbFYtTzfD/XdPd4/o1RIfIcuOeo4uT1RUWiJDWBg/w1oLc9uXXojRHONRD9JGxF1TjZxRUzOfmG928ZIyfAz2QhpU3EYUjH2q0g== 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)(5005006)(8121501046)(3231254)(944501410)(52105095)(93006095)(93001095)(3002001)(10201501046)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123562045)(20161123558120)(6072148)(201708071742011); SRVR:CY4PR04MB0406; BCL:0; PCL:0; RULEID:; SRVR:CY4PR04MB0406; X-Forefront-PRVS: 0673F5BE31 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6029001)(366004)(39380400002)(39860400002)(396003)(346002)(376002)(189003)(199004)(53936002)(44832011)(81166006)(2351001)(36756003)(6116002)(48376002)(6512007)(16526019)(186003)(486006)(11346002)(386003)(6506007)(2616005)(476003)(956004)(3846002)(4326008)(446003)(39060400002)(76176011)(50226002)(52116002)(305945005)(81156014)(8676002)(51416003)(8936002)(50466002)(72206003)(478600001)(6666003)(6916009)(7736002)(2361001)(5660300001)(16586007)(106356001)(66066001)(68736007)(105586002)(316002)(25786009)(26005)(47776003)(2906002)(97736004)(6486002)(118296001)(86362001); DIR:OUT; SFP:1102; SCL:1; SRVR:CY4PR04MB0406; H:risc6-mainframe.int.fusionio.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY4PR04MB0406; 23:ivQ3wRI246bE6xH8+CRrnrZ31YTrhmz0lw4SnvfPg?= =?us-ascii?Q?Za9HXgO2uOcLGWh2qdA1qmDvDvTjvSQcBZDNtt+yhqGGZsJuzIMorPBx83jp?= =?us-ascii?Q?V2TSH/RihYwkEKDvQgOAf28h0WelBOEJFUcCfcTzIWGY1PZL7tzVglE3yVv0?= =?us-ascii?Q?wMAQ5pwlEFoNSeVfxanBYj6AvY2oGisn22cNzYa9fUzO3mqZloJRyBx3PXQE?= =?us-ascii?Q?UWCnhADtoqvH0m9gIw8SwY9UVDpH3AZsHh+yZmaVrViqMz3bPv+A5W3Ek7Ep?= =?us-ascii?Q?xReYkux3BqZCzwuJEN+wSigu/pcIl4SrXxWIKwK3LBFL3dx6eJEqWgmiMXPB?= =?us-ascii?Q?NmhbYy5TTJzhuzb224+kIV2a+hmVgj7HYbq6REdpfHoyQ0gH3aMOGS5eRa0d?= =?us-ascii?Q?e2sD8bGRpyRMaEn0bwjbdTQx8ZuMocZ5VTN8beKGlK/GScNEkhEDGApmz/C3?= =?us-ascii?Q?C1YegBQbzpi5ln2CRGtyEAMXvonriFeMaDw4ec+ltbYTk2OQ3PwrNF3cBF8+?= =?us-ascii?Q?itjovCqJ5NHpbn415igPRZIhKkviM0eJKX7chnYLSFqCtaYzBHqo9o9Tt/fE?= =?us-ascii?Q?dFFASRbqAtm+bTGnirTn9liqzm0rScnC3ztAX2AhWeUisuEjCmAwpqT2c1ax?= =?us-ascii?Q?nqDJ+kuJ06VjDKdW6y1fwJ3WJq92bI3gfeTDE42sJ1UGqwhctT0KZ457cSzE?= =?us-ascii?Q?p3gftSkNJjWgkzP1uYLdtg1C9XkHSQJn5Vvxm9gSqhoaDrTt0R3WwZ85H4+k?= =?us-ascii?Q?O01Qy8HyFrj6FQXE2Soc7+DPoIZOpM+uCYtfZC0BafU46wJW6mhIMty0RcGH?= =?us-ascii?Q?lQEzLJOBtOsXvoxU6KFml1Wrcx83eyprhSzcdklB4/3EcjTop2KHQZD/kN36?= =?us-ascii?Q?s+0mQF+l7eS4SMBPZCjlWU+mxcFwErxKq+AFVNrt1XN8Jh9zSo1UOo3aTZOZ?= =?us-ascii?Q?o7ICEPWYfeTetyI1wTSivG+Y51rLncQZTlVK9z8yZqI04SQI4GYW/y3ERDOR?= =?us-ascii?Q?0BVZhpdEaKMKSM0P6N4aZxuVuklwS5D+mIMn9zts9E6XjXD8mpMOaaD1QYaj?= =?us-ascii?Q?pLGZAYVziQKQpNEpyr5mAPN5ZebcZXRpCP9mFzS3sGDO29uTdqmZ/YWtKeZZ?= =?us-ascii?Q?pr6GXc0Wbqo/Li94qt/9l1CXpYUf6mLlW/w2HByuiZK8AoufLCjP9VrYardm?= =?us-ascii?Q?WAU8mfeVosvSZqjQ32RxNT4ai0pJm9vLGdocZ9nVcziAmtN4xOYlXecG3JS/?= =?us-ascii?Q?2SoKPrJLYW2Cn+rNtOEDISbAfRpXm0C8K+gce+nLGoYBVDj8AYKzbcKycPhy?= =?us-ascii?Q?vLxVqFjc2Czu7z5XyEoH4HnBFCD74tAyjqoOL0W9aPE?= X-Microsoft-Antispam-Message-Info: dnRIUXQDSpSbRH5ZA9TBkSHNOhP8LQuAAnmsMghgKYOr6siFluuWcNIcVMvkuPKWHaXHZFqNMDutEY/CelqlZ6a+vPKlNS1/19GNFSAUIidfHJdNZ16uJyXt21+1UXhmjsTKAWRqG6pWyX8iQmjOb70i1vR0xvGeLn0TZafDbau5KzZGaTCMDyKD3qxKNq2O X-Microsoft-Exchange-Diagnostics: 1; CY4PR04MB0406; 6:xneg3fN8gtc8dffNN1kyPuB32L2AxU1IPMkYpqIXPSqTTDtZ0mc2VLpoXpNKjKmFgvt5fLDYwsUi28ko2FiV7DRR156N/IYO8GRoLSJtFM2C1rZIkhE+3ouqWiN+oLj0nHjS/fs17R4I1pLMkf18WlZDeL2B7ZnBaQQt/lS4JSSwMnyowbRsA9sYVckK2NL2I9urUthlFLmas9HyONYnfQfm+4eYfQxXnTlvRdkgeRDy6+18QxVOpz3oRM++XiOnwuq1B21lWjvHnTS00emkSeAqf1ZnYjZGtFP8cz0XzxLC2MCE5HIHTD5mriqbfNaCGpPLmJLj+o+WRwKhSyoMKT8wnTiytMrSLWmw5HpLNl3+mTsAAi+Yj6XnyAzpNL5XN/Uc8PI8pyz+igbqMzlpUy50BFDPhY1GAWA2EbkPIufqqfnNMeaufnzpdHvFn9udce3muH3L40LGvI0JUpq2hw==; 5:tOllwop+BhDRMc5yWT5BJ/Ek4noklWHHOs+b8wXvq16awEGBpq5x3lb3d0JB01oDpkwvWGe2IEbK9CHpqgNSduERuwzPNiZnMj94CIAvXDFlYtuugWmxJm3cUHih1CIJLivAECoF7vsMBW0eAgodsdS3xuhCm6SwaoryUzghidY=; 24:4lfMO58aZDoekl3Xe+EBErFf2sT8Wz4+7QQaFpvRKgQh79k9XPZYDRvNgZ70nsjFgS7Hqck9uWBYeYGyiVGrTJ7/DdP/gei/ktis/C7LVyM= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY4PR04MB0406; 7:ke2v5nYNG5iypFRj39Z+U/4AUL0+8aNi39HVc8Ey14FnuACd+LFUpB1kcoVxISJErVFHaMaujmYrJCD0O+yyn5rirJEV2as80bFAS3X4tyhU4yKcClb7+TAKpNfdPjhf1tVgB10SDXp7NFAZFpKht54zMG21a5A2EqtLbTBR/3075lOQUEWITnUZdShaL1LPHnv2wBkiMQqHrRvwFL7sEUgKaaxPsyuZngAvQA/sTtS8my5YpmoWOgsC7OiaW/fw; 20:T8pmFPEu0UpW1AIyiIm9V3Lc0m25Ip9VdzABOlUY6hqXBVZSFPiAaoNr/bFEojmnmOBjM2DrTWL2f1J1ic5nkJXSADK6S56jKgtedyGcpGEV6GrFYIf7yVkhqlfIGotb4JglPgsD9UIOYJulkW9rL8CRTLC5Al/MVNy+HlvPwos= X-MS-Office365-Filtering-Correlation-Id: 6f301b46-9591-49f2-8e59-08d5b9f7ca53 X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 May 2018 00:07:04.3296 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 6f301b46-9591-49f2-8e59-08d5b9f7ca53 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY4PR04MB0406 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 216.71.154.45 Subject: [Qemu-devel] [PATCH 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, mjc@sifive.com, alistair.francis@wdc.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP 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); - for (cpu = s->soc.num_harts - 1; cpu >= 0; cpu--) { + for (cpu = s->soc.cpus.num_harts - 1; cpu >= 0; cpu--) { nodename = g_strdup_printf("/cpus/cpu@%d", cpu); char *intc = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu); - char *isa = riscv_isa_string(&s->soc.harts[cpu]); + char *isa = 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 MemmapEntry *memmap, g_free(nodename); } - cells = g_new0(uint32_t, s->soc.num_harts * 4); - for (cpu = 0; cpu < s->soc.num_harts; cpu++) { + cells = g_new0(uint32_t, s->soc.cpus.num_harts * 4); + for (cpu = 0; cpu < s->soc.cpus.num_harts; cpu++) { nodename = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu); uint32_t intc_phandle = 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); - cells = g_new0(uint32_t, s->soc.num_harts * 4); - for (cpu = 0; cpu < s->soc.num_harts; cpu++) { + cells = g_new0(uint32_t, s->soc.cpus.num_harts * 4); + for (cpu = 0; cpu < s->soc.cpus.num_harts; cpu++) { nodename = g_strdup_printf("/cpus/cpu@%d/interrupt-controller", cpu); uint32_t intc_phandle = qemu_fdt_get_phandle(fdt, nodename); @@ -181,7 +181,7 @@ static void create_fdt(SiFiveUState *s, const struct MemmapEntry *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 = g_new0(SiFiveUState, 1); MemoryRegion *system_memory = get_system_memory(); MemoryRegion *main_mem = g_new(MemoryRegion, 1); - MemoryRegion *mask_rom = g_new(MemoryRegion, 1); int i; - /* 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); @@ -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); /* create device tree */ create_fdt(s, memmap, machine->ram_size, machine->kernel_cmdline); - /* 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 = sifive_u_memmap; + + SiFiveUSoCState *s = RISCV_U_SOC(obj); + MemoryRegion *system_memory = get_system_memory(); + MemoryRegion *mask_rom = 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 = RISCV_U_SOC(dev); + const struct MemmapEntry *memmap = sifive_u_memmap; + MemoryRegion *system_memory = get_system_memory(); + + object_property_set_bool(OBJECT(&s->cpus), true, "realized", + &error_abort); /* MMIO */ s->plic = sifive_plic_create(memmap[SIFIVE_U_PLIC].base, @@ -314,3 +336,27 @@ static void riscv_sifive_u_machine_init(MachineClass *mc) } DEFINE_MACHINE("sifive_u", riscv_sifive_u_machine_init) + +static void riscv_sifive_u_soc_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + + dc->realize = riscv_sifive_u_soc_realize; + /* Reason: Uses serial_hds in realize function, thus can't be used twice */ + dc->user_creatable = false; +} + +static const TypeInfo riscv_sifive_u_soc_type_info = { + .name = TYPE_RISCV_U_SOC, + .parent = TYPE_DEVICE, + .instance_size = sizeof(SiFiveUSoCState), + .instance_init = riscv_sifive_u_soc_init, + .class_init = 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 -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; /*< public >*/ - RISCVHartArrayState soc; + RISCVHartArrayState cpus; DeviceState *plic; +} SiFiveUSoCState; + +typedef struct SiFiveUState { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + SiFiveUSoCState soc; void *fdt; int fdt_size; } SiFiveUState;