From patchwork Fri May 4 20:13:47 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 909055 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=wdc.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=wdc.com header.i=@wdc.com header.b="K1ioYgNZ"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=sharedspace.onmicrosoft.com header.i=@sharedspace.onmicrosoft.com header.b="avNVGkRp"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40d5K81spgz9s2k for ; Sat, 5 May 2018 07:50:04 +1000 (AEST) Received: from localhost ([::1]:36559 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEiaX-0007jf-Qr for incoming@patchwork.ozlabs.org; Fri, 04 May 2018 17:50:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44598) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEh5f-0006jC-FD for qemu-devel@nongnu.org; Fri, 04 May 2018 16:14:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fEh5c-0006xR-6a for qemu-devel@nongnu.org; Fri, 04 May 2018 16:14:03 -0400 Received: from esa5.hgst.iphmx.com ([216.71.153.144]:29065) by eggs.gnu.org with esmtps (TLS1.0:RSA_ARCFOUR_SHA1:16) (Exim 4.71) (envelope-from ) id 1fEh5b-0006wD-PC for qemu-devel@nongnu.org; Fri, 04 May 2018 16:14:00 -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=1525464841; x=1557000841; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=yMP0cCAgZBTOefYacU4L4ZsDAvw/GJts1vM8zeeN49Y=; b=K1ioYgNZRViYR3dA4AWBPNJbFXPGECqaRHsU5cQ6sfHnr9xEWqAIfClM uZGwE0A54AsYT5l7nKR5biWuriJW0SlhE4kOI+UotLMd18hxWXQl/JqoI CA/RtbBkP8u8932xmHniCkeK47juOp0UDNbTBeSQlo1RdV0YT/JDC6h4Z Ii1nDTCLYbo+h6YvAsyMj8ezKZcCt4TXxeu6T99W0QXaZFUmTk9CxPiwy 359B3qOrDGHZqm7H0whFx0GLUgLk7+zM5mMUZakCkuTFcz4wsmwxSOsLF 4rYoMTb8t8DxYC9CTU+UvCNt9M67WwUU83wMtJm6LRDOs5Thq66XBJHOV g==; X-IronPort-AV: E=Sophos;i="5.49,363,1520870400"; d="scan'208";a="77492478" Received: from mail-sn1nam01lp0111.outbound.protection.outlook.com (HELO NAM01-SN1-obe.outbound.protection.outlook.com) ([207.46.163.111]) by ob1.hgst.iphmx.com with ESMTP; 05 May 2018 04:13:59 +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=af6DIvZP9uwEYOqJ7rzQ8/GGbA8dtXJF1aeQjsTXHbI=; b=avNVGkRpZ0icsKjWF0mni0zUka4s3wXfxTRXQDng60UVo2oeZvSTeNgp9D0o8f1Y0nm9Lr4rwjSjvAsYVkD2MfK1z6+LvmhOEJyb/d0NEby8zB8PnIQ0yxcCvlovSmkVjILVPt9DE1mvLbq41RmDcCNjy1hsfn4EX/Zqi0uez0U= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Alistair.Francis@wdc.com; Received: from risc6-mainframe.int.fusionio.com (199.255.44.175) by BN6PR04MB0403.namprd04.prod.outlook.com (2603:10b6:404:91::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.735.16; Fri, 4 May 2018 20:13:56 +0000 From: Alistair Francis To: qemu-devel@nongnu.org Date: Fri, 4 May 2018 13:13:47 -0700 Message-Id: <18aa905475ab9a2dd5d8b7cd04cd037bb01a4e64.1525464177.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.175] X-ClientProxiedBy: CY4PR1201CA0003.namprd12.prod.outlook.com (2603:10b6:910:16::13) To BN6PR04MB0403.namprd04.prod.outlook.com (2603:10b6:404:91::20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(5600026)(48565401081)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020); SRVR:BN6PR04MB0403; X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0403; 3:NPSd1jFZKer+Yz9go07azpElQMzNK7KoF778jD0aJR8txi9leMIRpYeSiFoDpulzGeYaw6RQv6gU0iqRL7X4QjyP2jW6jwKEFjEFD/KCWFz80wYGIb9yQKjQFES+B94uwg0L6RuG176IEnBkuFA8rVzO7Q5I5X0gIaHtYIWKASDUHHndPVwIHrpJCSp14eaiDmAwsfa1ld5yfR8GqFqQGzKiUeyG2iojL2IAU03BNh8mDYH0u2DSOOzhxIwEsy4M; 25:Ys8iuCXiNmSe3eNaJgN4Oxrm02JVdRLLu3N4kvpYpxCWyxHTRUOXzT+OhLokM+Q0GxRz/xT80rhDJQoMwvGtdGAaox5mFWtfkOecZfgZaNaxXHmlxQZA+tRKxnIFalrHp0oMsoSGpM/lDIO1E/KKm+DxuWdQUgtIvi9VnGeiuPNVFCyazYTw5NL8wojlx/l6hod4w4rHTCJy0OAujU0YXnEE6NlOPz85PmdA+2tOj2/l10EVy6WumjHdjLLzG22xgMF5UANMf3bX0fZrN+MPj8ZW0ou+l/yWeGJCgATlLivBjJWhhYR0Large+7ObuF48HtF5ejGJZh8UTn+9J/k1A==; 31:fewB12e/GCJJtDAMV80iR34RiXPGqv7I06MC1hiuDC9CxQ2Hvn2HDRBOEN0D/6C3eRL0vGPU6OZFgkZlVCAdbJ5m7tuFe3q7xx+ZeE2f3AMdN3bUdaBu/Q8y5dllBecCU/2ij/k0Z7VOkwAJiL/TlPFiiJP2RjcCqfcHpYYbWdS/bDPZIdlgBubjvBJVK4wuru7+1cag3J/REvzLDpfLYiC8hB3LNsF33TobO2OfAl4= X-MS-TrafficTypeDiagnostic: BN6PR04MB0403: WDCIPOUTBOUND: EOP-TRUE X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0403; 20:76gMO5UcsaQGqGInoDDZiNr3RqSlu+rr1oeJG7XxqaUl2JkxwDQT5zqia8p9z6gYUs2W5fzLQioEyec11c1mWOiArG9WRf5ODAOfnSASL5sgiL/D92wzYlcqKnthO4IffDoQRldHTsgqMYDOqlPlXbOrvLOBgpOzATMO3Y1vJ+Tsn73H8AdEBiqkauD6opcc46baDX1GIjfLYo/GUvZFwor9mumL28OddB0RcZKIPiwjJRaVQhbQ6YAiTRnqvQoRhmapKoaccgjQT0rVsOPrsj1qyDbBZexz+mEmkpohyxVpBqiYEGt445FwhJ6i3gbdNUKj3cQf6t8h01nNbPLovv+ddt2dno64fBNzM4UiPOULw+wPWC5iR9aSLAdcNDrDObpbLgnhesWjImfJYEwMcEOy7+H44ctZs9DYWQPwz28OcHyFMf1lz4zZD6YugshAuO9idqv0A0DFpciRQnIJQlDuyZaIQ7byJr1+8V+lOjsVkIBwgCWGLtOuK0LgSr1f; 4:7sJM4+RMz9gV16eWr1xydhU5iFPNAV4pUeXPUL25usGJxEU6d9qs2U+ZZO8mdR2QyNmDXhl5fY0mBS7CWCWvXLUoL5dkC03LTIYRa147ttHDoagPBkGUD7jGmXo6SPHWaVgIWu9zBJK3gtYNPW5uj65Ruqsc0H16GsrgXUYz9/3P8Q7UnPID8wURCh4glFaT0ZqzGykCBSytVNsMrDT20+HcY8NtYfSO/wPgwAp3rQXvpQvh2UTORvLtKGyaXGxyPBU/Cvxtp1AcecSuiZFzhQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040522)(2401047)(5005006)(8121501046)(3231254)(944501410)(52105095)(10201501046)(93006095)(93001095)(3002001)(6055026)(6041310)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123564045)(6072148)(201708071742011); SRVR:BN6PR04MB0403; BCL:0; PCL:0; RULEID:; SRVR:BN6PR04MB0403; X-Forefront-PRVS: 06628F7CA4 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(366004)(346002)(376002)(396003)(39860400002)(39380400002)(199004)(189003)(97736004)(68736007)(86362001)(36756003)(81166006)(53936002)(478600001)(72206003)(105586002)(6512007)(6116002)(4326008)(106356001)(118296001)(39060400002)(2351001)(47776003)(2361001)(3846002)(316002)(8936002)(16586007)(5660300001)(59450400001)(25786009)(6506007)(386003)(44832011)(48376002)(66066001)(50226002)(50466002)(446003)(11346002)(8676002)(81156014)(52116002)(2616005)(956004)(76176011)(51416003)(2906002)(6486002)(186003)(26005)(305945005)(6666003)(7736002)(16526019)(6916009)(486006)(476003); DIR:OUT; SFP:1102; SCL:1; SRVR:BN6PR04MB0403; 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; BN6PR04MB0403; 23:94vKAdpKwGWCwRkfkHUYOJngsQJCvvpTm7eQhMW5o?= pMCZy4lcUJ+8Z9CGTW2pwKcdTu7eWJEZw8eJga6N5dOkgYs2+h62HOLuQKlVVJd/3Fh/E/jWiI8Kaj6eKunIOm4SsIGIVanJGT+OFdXnn0fQze9pxD6e7jqgyVw4Rbv3uWrlERfF+5Emi2QhWn4/SZ2jG/jxpCw8OC0yMz0pmYB3J5keLXB4rCwSrxhy21LCSHjQW5GjKRR+ClluJhCLPVD0sugu5rqzCDROziqyM7L/xP7tTZILH+QsGBhbChmimUDqUTtMXtMUDDf+Lj9lMln4VcPPkoqs4paMGF9vnfsKZ2io3kv7auqiFbgW9Rff4Tvv562zSpAMlOqi3mpjySfs4+2HhNYjT6NXyJWWECBfyk0Zo9uGSnBNG/8Se+ZdAn4QGcnKVndkFuMQlvw8ACf3RL82bVj3hlBP7Mu43z7MrrOBbD8q85z/qhoCQNUajbgD9o1xZ+5Virc1PaZIWtGnPpv0e8ogVr+MXmgLn56kFrpuY2eCZqI7UyM5x1g44khvyxa5U4rwPFS15yFlsmjRoIuhYhtf4KW0xZf/JV2llhVb0R2dnU5kdLJXzRQiqwPVhN1h1nN2x7XOFnRY0UHL959yMkJdX/iUuzz8UgIPzTv99o4/b3RafBKPPEwXBvmA3mQPUXL8V5FHr+OSCxTCDNVXIRPLgzjVRliKgXJC5JTZjHIbPMnM2cs8hLDcQ3Wk4TvtfEJyvjbcDxcoobQ9wRaTFmLxQnArjNPYLwfTKrzHTdvJjHZFUvqQeYbDxy3N0/pA3uGBAj8lHiFKaPvOEsaIpvtxBEX/9Cccu3mGERBqoTdlsFT+SyWUS/ZzLz8BhDXSMWldA9hef+yMUOa7olxvCuGZoTNG03i5HX+OqlnnJx4JvBbIQSW4E+48D6YMmXps1hVSF2jqGPJBSgaj3Rnu2alYpLREofMUCPvZkd6ZSh4zizJmQ581d2/v0i1f3gXgNV+wmu9Hxy4Udwc1jbceefECCQeMgpU5gbrQkjtwoYyZleNOidn6ztCEr8rXKQLawA2gz1ExM8jTBAcoY+6O5tN95msABVKK0logW/HCudn1mfPk3fgkAyIJZVdXKHvmr2NUTOTRWEtlQ+B7EpsK0/z0jt2TKhqfmKDJ6aR0Z2YGZMb95FhN999umZ6HTgm+AjsJtjf1t0y2UBfRV0kL3HjjQSUT5f+2/ffAAyFgXR/vqN6G+lyuqquu/AKkDgBcn0ff7GwDZM7kR+lvEa94K1nuvehS/uED1o7xOdHAfYM+vH/5j9c8eCu1JF7ofsZcmT/SG/rG660zO6Q X-Microsoft-Antispam-Message-Info: NZx3gPvAQUS+HStFwRdwjKo4tCewaImvGaWJ3ydUUB5KLeBjzqnm2JM456EEShFgE9NhAawID4kBfVaJgZYCtxdrYv4S/WesF2/+UPRFGbcHP3M/b+fFCaYwwCvUfMxuFWiwsP9XyvnBbRwv0GLybajs6cDuAKt5bXI5QoX9dM5+F4E5C6x/x1v8XmwN+z5V X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0403; 6:AhQs88YV1Z7uQPj4DS8C8RMhUAwKNVNm+GRCcbJEkS63LprBCaGemEvS+GZzLzDbUWh9KA9SCD7c42M4Xnglhpm07jw9DSJjqrN9n47BfxNk+u0w4F7aafOXt/93krl0xJF8zL4VYkSFOWGGjvXenAxo4ELU8PpNzj3EcRs45/2WqwICSVmuACR0uRRu0JWGb5MSMzVZfWvU3Dd0aMT/Vt38HG+oIML4rHZdpmI2+AvJP6xW4ANBt4EDr1qUmiAoq+E7M7AW+v0M7FZiNJXEW4p9oFuKcCUfZSEIJDcsE3OEZIxcmC53H6j/EEAnWhP66NqCV4caX6LR+Ax+gAFnf+VYkTCEkavut7wy6kfkCUDozYcMBXFSV75oKAmGDn8w9PLGG0+bEuS7c/9TZkImnbjIK2k7YgXN9IPopqeOUVGj5aIeIAUbtJ+fo0hULa2zjlXOLTqx2gAvUgxWmUS4NQ==; 5:DPOcNZx0J6oXxFy908zYSYqDZgum/cScckD6pIZ18baq26o7HZQlcnebo4LcwHYVrWtfYGCVwXqlxDtDcKqVvNkfG5xHgBTt81Gcgjl0XLNNOSLHvt3NcODByhdcQMMKopyMPNX5VhckLnrxZNPXWxfPhTby3Yo3z81lOo9JyaE=; 24:vNDROjT0ajBQgDGbUKFgg4XHfYlEKtZ2pJIpCfk4872C/AB3E8xttRYTiHzuFTn79rvAhWVEKlfwoAgQiF0ucqybBMD7VFfwZjodot4hf3E= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; BN6PR04MB0403; 7:Ro+rCTr/+u4fLYeaK5IoC1hiBFKFqPMRlQHzDyad61H0F/JTr9+FV/phrz4XYxelrIjW+o5YW7frLotYTWlZeRGuBik0E+QdJpP9AVI69q+xyvUpK9/LyzzXzWcgDUpUfOB8Rl6fVLesS+GmhMdAXvFlbKQ9U1WBDSRpgVIYFIInRHj+uayBIuosdej9ajAG4JEXqN+8F2nxyjELnh+G/wCeTEGq11z4sVCTDKjdGiZxshoZz0Lj87jrBNTakCNf; 20:vszKLYMTi0qHIvEw3eWxdWHg5dLjfrx9KdDRVYRSiQuJoeps5HXxAUgsRtC7w6mQz3uv0Zbz1h4QQ7/Oxp+ZW5xAlFkFWWYSW9aki2/RuXstEdCewlkTOiv7KOhTHJcAgd7berGTQbF3Kw/faz3cN5W0ETfqcDhkCFy67iWrYGU= X-MS-Office365-Filtering-Correlation-Id: 094e1f32-b3d1-4c1c-07d8-08d5b1fb90e5 X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 May 2018 20:13:56.2654 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 094e1f32-b3d1-4c1c-07d8-08d5b1fb90e5 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: b61c8803-16f3-4c35-9b17-6f65f441df86 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR04MB0403 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 216.71.153.144 X-Mailman-Approved-At: Fri, 04 May 2018 17:46:58 -0400 Subject: [Qemu-devel] [PATCH v1 4/4] hw/riscv/sifive_e: Create a E31 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, palmer@sifive.com, alistair.francis@wdc.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Alistair Francis --- 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..0ab5e3ca45 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_E31_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_e31_init(Object *obj) +{ + const struct MemmapEntry *memmap = sifive_e_memmap; + + SiFiveE31State *s = RISCV_E31_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_e31_realize(DeviceState *dev, Error **errp) +{ + const struct MemmapEntry *memmap = sifive_e_memmap; + + SiFiveE31State *s = RISCV_E31_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_e31_class_init(ObjectClass *oc, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(oc); + + dc->realize = riscv_sifive_e31_realize; + /* Reason: Uses serial_hds in realize function, thus can't be used twice */ + dc->user_creatable = false; +} + +static const TypeInfo riscv_sifive_e31_type_info = { + .name = TYPE_RISCV_E31_SOC, + .parent = TYPE_DEVICE, + .instance_size = sizeof(SiFiveE31State), + .instance_init = riscv_sifive_e31_init, + .class_init = riscv_sifive_e31_class_init, +}; + +static void riscv_sifive_e31_register_types(void) +{ + type_register_static(&riscv_sifive_e31_type_info); +} + +type_init(riscv_sifive_e31_register_types) diff --git a/include/hw/riscv/sifive_e.h b/include/hw/riscv/sifive_e.h index 12ad6d2ebb..5cb19cd564 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_E31_SOC "riscv.sifive.e31" +#define RISCV_E31_SOC(obj) \ + OBJECT_CHECK(SiFiveE31State, (obj), TYPE_RISCV_E31_SOC) + +typedef struct SiFiveE31State { /*< private >*/ SysBusDevice parent_obj; /*< public >*/ - RISCVHartArrayState soc; + RISCVHartArrayState cpus; DeviceState *plic; +} SiFiveE31State; + +typedef struct SiFiveEState { + /*< private >*/ + SysBusDevice parent_obj; + + /*< public >*/ + SiFiveE31State soc; } SiFiveEState; enum {