From patchwork Wed Jun 27 17:44:30 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 10492337 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 0E2F860325 for ; Wed, 27 Jun 2018 17:49:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 280C929896 for ; Wed, 27 Jun 2018 17:49:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1A79F299D3; Wed, 27 Jun 2018 17:49:37 +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 4FC5129896 for ; Wed, 27 Jun 2018 17:49:36 +0000 (UTC) Received: from localhost ([::1]:60699 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYEZT-00073b-H4 for patchwork-qemu-devel@patchwork.kernel.org; Wed, 27 Jun 2018 13:49:35 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49268) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYEVK-00042Z-2l for qemu-devel@nongnu.org; Wed, 27 Jun 2018 13:45:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fYEVG-0000Yq-TP for qemu-devel@nongnu.org; Wed, 27 Jun 2018 13:45:18 -0400 Received: from esa1.hgst.iphmx.com ([68.232.141.245]:46698) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1fYEVG-0000P1-E7 for qemu-devel@nongnu.org; Wed, 27 Jun 2018 13:45:14 -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=1530121514; x=1561657514; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=/KuvZZNKysgI2G0BykqNNF2HqGNRfOu3vCQ4mktBpMk=; b=Be+0cqVbQDF+ZJoCPDrJWX+09pQPk1CtLdfm6F/TmOmaApmtSowa7C18 Q0JxSxe/8Obx/OYJHou3eqXUVvY/H3kBPdqv1I34hpUvPXEzAQsappiop h95tSbK3rWQ462trnNJVKvGPknewU6Scl7NxUdOTvqs9Rnum7xRzU4E0J erQvcEBwnarUR/UdFv79YcwKkwavrHR+acORQZIJbH1LffdZi4SCOS7ef QgZcQufgjEq+cEeD//n+wYofH+MCgRA+587lDmMznivEyxn2O0ftoPnKI zKxKYIO2lCl9uLbbNFvTSBmbsBYNfvHvFL2huseoNGU84YrSewWCfDB0L A==; X-IronPort-AV: E=Sophos;i="5.51,279,1526313600"; d="scan'208";a="185607654" Received: from mail-co1nam03lp0023.outbound.protection.outlook.com (HELO NAM03-CO1-obe.outbound.protection.outlook.com) ([216.32.181.23]) by ob1.hgst.iphmx.com with ESMTP; 28 Jun 2018 01:45:13 +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:X-MS-Exchange-SenderADCheck; bh=P5Fw967ZvfmeSlYWKt4fON/PFEIAr/G0m/eKNUF8F/8=; b=jxK9lwLNT4fTZRBPzMcm1jH4rnzVeHeYJptfnOOA6lljYr+WjpjNXiFtRGQtXussF5sD7luYKHAo0NndbH+90TOp5nj/hiXYRN+aOdFbywt4VPsVNHhSMgHTc0bQEwv+65PlleH3GpNv/+fZphJ70EsWpttTAKX/RDHA0s2tUO4= 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 DM5PR04MB0396.namprd04.prod.outlook.com (2603:10b6:3:9d::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.884.23; Wed, 27 Jun 2018 17:45:09 +0000 From: Alistair Francis To: qemu-devel@nongnu.org, peter.maydell@linaro.org, mjc@sifive.com Date: Wed, 27 Jun 2018 10:44:30 -0700 Message-Id: <20180627174435.31800-3-alistair.francis@wdc.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180627174435.31800-1-alistair.francis@wdc.com> References: <20180627174435.31800-1-alistair.francis@wdc.com> MIME-Version: 1.0 X-Originating-IP: [199.255.44.171] X-ClientProxiedBy: SG2PR06CA0125.apcprd06.prod.outlook.com (2603:1096:1:1d::27) To DM5PR04MB0396.namprd04.prod.outlook.com (2603:10b6:3:9d::17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a0f4bd6b-bcf9-4858-4c6c-08d5dc55bbb3 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(8989117)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600026)(711020)(48565401081)(2017052603328)(7153060)(7193020); SRVR:DM5PR04MB0396; X-Microsoft-Exchange-Diagnostics: 1; DM5PR04MB0396; 3:xsDMcuyIm+Grm2kpRm5Yxcw3ozda1Hv/p+n20bVWN2H1PxL22LSVRefBWYvpbjiD7okJuQvwKVFX6k9frLUQtLpOv9ZHjWLZu6EWQleJ0lOHACUzGUr5uPpztUA08zb9zCwFRmT/0trvPg69+n/6P3B0V8fDechmajKa5DGYzFy9yF85QjYW9GcN8BggN40SVtsQgmt7ShRrMDCZeWuRIfd81ls+d4OtdwSSvj3k+lYjryu9Lzb9Rnt3BDzNkFXy; 25:yhLbOxJxvMX7fHwqAlPMosP8dTHjTKpGmoxnvyjPi5iFtdBsggqq67QgCPv2FGy6CdIqZdMI3j68i0Wq1+QqRxx4YtNihbUzjhBIFzkvVjn9b6ukHjWUVuQ/7H2D0k2vRZQrxFHw33lER5cHwUUVhHeN5f3gPLR0JpF5YRJ1Bb7pmjEka18FDOP4si6fNij+TL77ZFDmgc4iFLmhMqY3MubqPcrMACtS3tFZHbQSIC9Ho/vKP4f7LipUSzDDSyf7xKY0+DzQu0pVpli0sIxiS612wjxKMuiJD1hFMVZi83GRku+JSwlIMUzbcaAAZukrWq0rAt2ZzrmsKoZ8sCFCwA==; 31:Q8ZAY3HiTkcgJteVMYGq8t6MqejjxXAMbFpT/s+0vFwZu17ykp+b+a+ul/JyHZTzZ3TavMTrzfrN1y+AvVD2vhtvXIXHu/S4gpEOQyvPQMBv9ygOZW1kZUYfxxpCcY6mXIdl3kTWZrHsbKUjSCxOPV2Mz2TTv024qHUcU4u99a0LVffyWskT4Ooavwv21Puaa1iBxTfqvFL3Pns9WqQ/5Juk6DxnVxs9J2r5aiPJDSg= X-MS-TrafficTypeDiagnostic: DM5PR04MB0396: WDCIPOUTBOUND: EOP-TRUE X-Microsoft-Exchange-Diagnostics: 1; DM5PR04MB0396; 20:WWl0O14JMG2evHrt9xvt6k7q1ylTn2BgJTnkYpx9u39+qchGvpdR68QV1CKL8LK9ODSQTgn3ITKtGA7W/YQyghv1kI7xnTXFrCsKpO6P8nmtaivwHV+fdY/OTnhzome32+0dPXB0CXfeD/1OtvrSqQjf4OS35yA+ggP95FQmb4DVOuyEJwd3jMD0b5Q9cq/4+Uq0GflazJrDnn+W90aN9KlzCLDrZPT4hBzt1xhKwWXqwikdzrOpGj4rPzwlqlwxanGm2zj7BEFqv2L4M4Lfnbpo78GlVeYvKd7RFbpcrUph9QNetkC0pVGlP2A/ft+neN8/jwZk6+pt8srIPis0J+J52aUSxE34doHTRW4EjIrPA4p8LzN0eWV3UG3sTL5zMXlZDeC8eg2DY6g/SFZa+E1xhB1OynNaQ56UKp7G+aKOPHVrk4PazPYMvvNFsu8GhcB301LvJQuajfWiSj4f1oUH/+36zju/R/pWM2FpOsUH09HGk0GiiBrVBZ2ECyRY; 4:UMSb9htVnnhZbotv3mLRSSO8D72EENhPh/xCOt0BdYwsfXm0qSXzENBUQXbcj0l872D8X9OM9NCrd1JJR/82vNGhQyk4avWaGB+HmM+keis1ZSN4aFAYVVpDZdyp+oi+zhuxqJqdbREZlSCvss6mxET68a5iTUxpsknIfPQ12PtCwcwmldz6vZsxbDKlDz9cN13OmMuCYSg+HTereQp+9QEBZ0WbtI1P7XvARVlVNOaFLZNLHg0famXKPpq0xpLfT5JLcduFXLI71Xh2kGZy8g== 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)(10201501046)(3002001)(3231254)(944501410)(52105095)(93006095)(93001095)(6055026)(149027)(150027)(6041310)(20161123558120)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(6072148)(201708071742011)(7699016); SRVR:DM5PR04MB0396; BCL:0; PCL:0; RULEID:; SRVR:DM5PR04MB0396; X-Forefront-PRVS: 0716E70AB6 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(6029001)(39860400002)(136003)(366004)(346002)(376002)(396003)(199004)(189003)(14444005)(6116002)(5660300001)(105586002)(44832011)(316002)(86362001)(50466002)(446003)(476003)(11346002)(16586007)(2616005)(486006)(956004)(1076002)(478600001)(6666003)(53936002)(305945005)(7736002)(106356001)(48376002)(2906002)(8676002)(76176011)(36756003)(8936002)(51416003)(52116002)(6506007)(386003)(6512007)(3846002)(72206003)(68736007)(66066001)(97736004)(26005)(81166006)(25786009)(81156014)(186003)(4326008)(50226002)(39060400002)(16526019)(47776003)(6486002); DIR:OUT; SFP:1102; SCL:1; SRVR:DM5PR04MB0396; 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; DM5PR04MB0396; 23:rczMtY7BX/hg8fZbsdXcXD850HuEfI/JM75aZv2a5?= =?us-ascii?Q?flDv4if5tPEGBCUeS4gZPdJCGqFR7n5Q4RFY0i/GikzncZtexp/5W17uTMQ5?= =?us-ascii?Q?xVXlOvbyaEyZJ6QZhCBwlbupcyWNcWhfz0M9P2OAGGiGaZTOFt6MeewIstel?= =?us-ascii?Q?PQZ1/Fhn092x5HC5f2PIJs5U14JEAbA2QkEVml6DpxZH63h2iw9rB4ybMsI/?= =?us-ascii?Q?K4knzlT6xLO2vOaaZycIKd/oXFZiRciFglOpdYE0tRWzADuY2jBUSeymOM4u?= =?us-ascii?Q?HURxg+1gYrrdTd2rQ7tqcxCyBnQ49rP+Ts0dnBDpICj1HYazW6VC7X8jrWrL?= =?us-ascii?Q?UtEudhe4SLHxneYBXxumJgKVudtCe0z+q8wGAfVXLJBHYXoNijEcskTtDExd?= =?us-ascii?Q?uai+ilHdJ7Loejho6dZD77D+R99BAOHQT4C90wqY4wakTNW32gm1lHiDxPk5?= =?us-ascii?Q?FAePA6JoZQ64SsS2LEBvwovWzJOfJzD+8RK0WwlQ8RNjtkuuKBYQRz4+Ryi6?= =?us-ascii?Q?3jDRgfx/0Jv5M+xdjNum5sj+XRFWjXvEOomva2HLivWMlPdO5xJDLz8mWLWB?= =?us-ascii?Q?R0yfsxB9cZnGzhJgByZD3St0ZtfHkSIbQaImwA/HUjwXbSd73g/zny7kAvnn?= =?us-ascii?Q?oyuUtmTRS3cby84MLOR3Q5KALLnR9YGo50wbeMTenfL8Sutfl65lxYvAiJpc?= =?us-ascii?Q?+hXlE/3ET2Q0OweLiynGZLQvF6irWulu+Ek/+4CwwYnMpNJCtqBvzCbNcmzT?= =?us-ascii?Q?FMsgV//Y6hO29Cn3uP5opbrgK5yrFX/9FGJc1cuPizdgbZzCsO8Zx9H54CBo?= =?us-ascii?Q?/sQs3l2yEK/UT5ISjBwItl8WXzvbXZSbizDXcCz/bkWIw5cLlxkNSqIWQCvX?= =?us-ascii?Q?LFz6s5XDkgfbGVO8nfob+LElLIovnU5haRSn4Z60Vq7P2bbbEdB6tN5pxfya?= =?us-ascii?Q?QgmSCxNRySv7VdGgZpfInrw+moOV1pnc7aO/qiaRbgfJcozDzQ4a7iDBMAoN?= =?us-ascii?Q?jdEurZgdUztx/wcEb2ys5pVH9pGvGE8Za4C4uRO7PVvzy6MS1o5NApXiHYaN?= =?us-ascii?Q?LvsHZtfADJ3fZC/MipQ/MKgAuQ4MSnBLVDb8/kl8HpLlNXzIhojksEhU9M4j?= =?us-ascii?Q?HWoyXGDKAxLrIusfSHkG1DBRgVb/aXMHaxQf5vWb8sxCVdyRqC6dKzg8zOct?= =?us-ascii?Q?tz9+pZHxvVXLCIR2vSELHTzWiYXByAuw+OQILupurywGopwRddH/9FbE5ECT?= =?us-ascii?Q?S0qNaWhaaLJh/JHqMV0bOVp7YmirI62MJZWe6tI?= X-Microsoft-Antispam-Message-Info: zKSfVSIc6na0L/TnsNjTYbuC+7CwwLyl3fT704g6PE8IaHtGV9xpgYPVVL+WIXFJSEhqgreY8LocpWdUITi+WGazzvb8NcnJmKuK7Oo91LfpfNvQfd5XgWcCn+spcKYCTZ8ckyMtQ8SbHvEjPGUBALy5gwuWLhSzCyVrPZrR/u76oedCijbrlLo3QImQx9ENQtT3qRtt492eyWzDl8TvL5BmavCvioTHa+3HwmOiVvgDzR6R62TfXBN1I1byW5mcpYXBevCi35++M1Fxi9Z9GomYKNXeaYOb9nQEr687AcES0LRuUxrO4HkMekNe6ozzqbXm/yHBf99gUUno/opncdQkIvxIlUkQN9N62wuc2yc= X-Microsoft-Exchange-Diagnostics: 1; DM5PR04MB0396; 6:6Fai45WAb93MXdojtHD8FayOO3wRhefOyKzi0osrz27cWl4fZpp35GLxZikT6cTaByFITbBiyACxBk+U2g0ZIJI5IKCgPmRZpHK8A5PaFGhXK+8uW71BPyEYoHqP57NM/hMk1c/BWRxKK1qQoDkQu0imkfj7q2/eDJlP6w13yYoayIeNxtvX8GJGfyVMFoorX4TqvRPAveYcZANUM/+9GhNaiMhnl0I9ktkIIe1ZEsb/CY+jtsf6ku8Qr4lMLS5tumX0ipSv4bEvtG10AIz2t2p+rl+rQHcKRj+rE12S/tUmAphd8GUtM2BNuHC584TIOhWX6eVarwVQPAOIInva/XcumLcBaVXRiW2BhO4x8p+PK6foXeghEBxLFSi5C4BPRTXjwh+HXCx+5hGZ713RtBaMYa6vcklp1bMAihkCQgBdFVRAuQd2gka709Nj01k0+VirpS4deZb6RuM5rB1WTQ==; 5:nWmjFvGCXZX+IOZTtpIiX3OSmHkIoFofMPZWR6YuAqTNOl3x1hKbK34ZBi67lDwBoyrpQtllz652KgF/tfBi76eg6lZDrRUlCtvh3vNfT//Z1+gqbE6cPCd3zpMHwIDbWng90s4l0Z+XHRrhkF33B3dW533OV7rg5PaHd9s0+hA=; 24:CGfMJKotBjX28I5mC1ucG5CVZUb4lAkz0OL6CytJNh9GiaIunYXNdMeVSzujiZxD6CAjb5JgvMvP8V5xp5YVNCRj2cccjbsw4iRG7kkKLXU= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR04MB0396; 7:k3bvLZOM7/y4drsDQW6hkSjoZ7XCqCna9s/1PIskOLJTCn03X2YiNeL9l2w01neI/8jOOpboeFMnZMJvQCbm50uw1bxMOl+cZIHjhr3a7xm0PCpjvKBDsFF2URAmbObHv0sRqGBDftKN0mzC4Epme4/7f3IcC3ggib1zc93+8v+xX4abzsWnZKoQnTTWleSelWafANKTgx6Z6be341yokKLZSzzanEdoblUVjcJ03U+GrkNE3XuRFrMIY7CMXnCQ; 20:nr3sTfdMLdTVVbDzhxdniwscwz4Hk3/MOeb5jLf8fTZea6DKKV/poO/tE7uZ6dGDlWFdIkxV7fOMvrod9DDO0BkhkqQ9YJWO1ih7dQe0eD18FrHACBboTjdkFqF/lIIjBjDQZUHRj/2BLSgou7W41NAxqQbZ7PWtxRQmdlpS8NM= X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2018 17:45:09.0495 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a0f4bd6b-bcf9-4858-4c6c-08d5dc55bbb3 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR04MB0396 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 68.232.141.245 Subject: [Qemu-devel] [PULL 2/7] hw/riscv/sifive_e: Create a SiFive E 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+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Alistair Francis Reviewed-by: Michael Clark --- hw/riscv/sifive_e.c | 97 +++++++++++++++++++++++++++---------- include/hw/riscv/sifive_e.h | 16 +++++- 2 files changed, 86 insertions(+), 27 deletions(-) diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c index e4ecb7aa4b..384b456540 100644 --- a/hw/riscv/sifive_e.c +++ b/hw/riscv/sifive_e.c @@ -102,18 +102,12 @@ static void riscv_sifive_e_init(MachineState *machine) SiFiveEState *s = g_new0(SiFiveEState, 1); MemoryRegion *sys_mem = get_system_memory(); MemoryRegion *main_mem = g_new(MemoryRegion, 1); - MemoryRegion *mask_rom = g_new(MemoryRegion, 1); - MemoryRegion *xip_mem = 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_E_SOC); object_property_add_child(OBJECT(machine), "soc", OBJECT(&s->soc), &error_abort); - object_property_set_str(OBJECT(&s->soc), SIFIVE_E_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); @@ -123,11 +117,57 @@ static void riscv_sifive_e_init(MachineState *machine) memory_region_add_subregion(sys_mem, memmap[SIFIVE_E_DTIM].base, main_mem); + /* Mask ROM reset vector */ + uint32_t reset_vec[2] = { + 0x204002b7, /* 0x1000: lui t0,0x20400 */ + 0x00028067, /* 0x1004: jr t0 */ + }; + + /* copy in the reset vector in little_endian byte order */ + for (i = 0; i < sizeof(reset_vec) >> 2; i++) { + reset_vec[i] = cpu_to_le32(reset_vec[i]); + } + rom_add_blob_fixed_as("mrom.reset", reset_vec, sizeof(reset_vec), + memmap[SIFIVE_E_MROM].base, &address_space_memory); + + if (machine->kernel_filename) { + load_kernel(machine->kernel_filename); + } +} + +static void riscv_sifive_e_soc_init(Object *obj) +{ + const struct MemmapEntry *memmap = sifive_e_memmap; + + SiFiveESoCState *s = RISCV_E_SOC(obj); + MemoryRegion *sys_mem = 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_E_CPU, "cpu-type", + &error_abort); + object_property_set_int(OBJECT(&s->cpus), smp_cpus, "num-harts", + &error_abort); + /* Mask ROM */ memory_region_init_rom(mask_rom, NULL, "riscv.sifive.e.mrom", memmap[SIFIVE_E_MROM].size, &error_fatal); memory_region_add_subregion(sys_mem, memmap[SIFIVE_E_MROM].base, mask_rom); +} + +static void riscv_sifive_e_soc_realize(DeviceState *dev, Error **errp) +{ + const struct MemmapEntry *memmap = sifive_e_memmap; + + SiFiveESoCState *s = RISCV_E_SOC(dev); + MemoryRegion *sys_mem = get_system_memory(); + MemoryRegion *xip_mem = g_new(MemoryRegion, 1); + + object_property_set_bool(OBJECT(&s->cpus), true, "realized", + &error_abort); /* MMIO */ s->plic = sifive_plic_create(memmap[SIFIVE_E_PLIC].base, @@ -171,23 +211,6 @@ static void riscv_sifive_e_init(MachineState *machine) memmap[SIFIVE_E_XIP].size, &error_fatal); memory_region_set_readonly(xip_mem, true); memory_region_add_subregion(sys_mem, memmap[SIFIVE_E_XIP].base, xip_mem); - - /* Mask ROM reset vector */ - uint32_t reset_vec[2] = { - 0x204002b7, /* 0x1000: lui t0,0x20400 */ - 0x00028067, /* 0x1004: jr t0 */ - }; - - /* copy in the reset vector in little_endian byte order */ - for (i = 0; i < sizeof(reset_vec) >> 2; i++) { - reset_vec[i] = cpu_to_le32(reset_vec[i]); - } - rom_add_blob_fixed_as("mrom.reset", reset_vec, sizeof(reset_vec), - memmap[SIFIVE_E_MROM].base, &address_space_memory); - - if (machine->kernel_filename) { - load_kernel(machine->kernel_filename); - } } static void riscv_sifive_e_machine_init(MachineClass *mc) @@ -198,3 +221,27 @@ static void riscv_sifive_e_machine_init(MachineClass *mc) } DEFINE_MACHINE("sifive_e", riscv_sifive_e_machine_init) + +static void riscv_sifive_e_soc_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + + dc->realize = riscv_sifive_e_soc_realize; + /* Reason: Uses serial_hds in realize function, thus can't be used twice */ + dc->user_creatable = false; +} + +static const TypeInfo riscv_sifive_e_soc_type_info = { + .name = TYPE_RISCV_E_SOC, + .parent = TYPE_DEVICE, + .instance_size = sizeof(SiFiveESoCState), + .instance_init = riscv_sifive_e_soc_init, + .class_init = riscv_sifive_e_soc_class_init, +}; + +static void riscv_sifive_e_soc_register_types(void) +{ + type_register_static(&riscv_sifive_e_soc_type_info); +} + +type_init(riscv_sifive_e_soc_register_types) diff --git a/include/hw/riscv/sifive_e.h b/include/hw/riscv/sifive_e.h index 12ad6d2ebb..7b6d8aed96 100644 --- a/include/hw/riscv/sifive_e.h +++ b/include/hw/riscv/sifive_e.h @@ -19,13 +19,25 @@ #ifndef HW_SIFIVE_E_H #define HW_SIFIVE_E_H -typedef struct SiFiveEState { +#define TYPE_RISCV_E_SOC "riscv.sifive.e.soc" +#define RISCV_E_SOC(obj) \ + OBJECT_CHECK(SiFiveESoCState, (obj), TYPE_RISCV_E_SOC) + +typedef struct SiFiveESoCState { /*< private >*/ SysBusDevice parent_obj; /*< public >*/ - RISCVHartArrayState soc; + RISCVHartArrayState cpus; DeviceState *plic; +} SiFiveESoCState; + +typedef struct SiFiveEState { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + SiFiveESoCState soc; } SiFiveEState; enum {