From patchwork Wed Jun 27 17:44:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 935640 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="Lop8Gavm"; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=sharedspace.onmicrosoft.com header.i=@sharedspace.onmicrosoft.com header.b="EJv5H/L1"; 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 41G9Lb2LVwz9s2L for ; Thu, 28 Jun 2018 03:45:59 +1000 (AEST) Received: from localhost ([::1]:60681 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYEVw-000431-Rj for incoming@patchwork.ozlabs.org; Wed, 27 Jun 2018 13:45:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49245) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fYEVH-00041A-VF for qemu-devel@nongnu.org; Wed, 27 Jun 2018 13:45:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fYEVE-0000Tu-J6 for qemu-devel@nongnu.org; Wed, 27 Jun 2018 13:45:15 -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 1fYEVE-0000P1-0T for qemu-devel@nongnu.org; Wed, 27 Jun 2018 13:45:12 -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=1530121511; x=1561657511; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version; bh=QWL4sg+r8fWzmU9vqIsxhgM+Zr3dXrL5AYq6SnOvmdg=; b=Lop8GavmuGCnzCOYvYILh9SnP4uK/uCZEk1dVqJN2XtV/e3hhSM0j22n guGBIuYeRIZeKKO9Xc6fJgeVQHTaQgKY7fJ9VnRPl6AEBl44dEVkreEwT jsTS94h9iADTvTlu5ZCu0MuQ7PqjIDTF0An+LtDEwp5Dw+CQ/M3S2MsVm 3E8UQWBVeDnW1zkNtWnOg5xFXKrUaKKNm755HXoSH6pwoOfoxJtInKZ9k 5UwmOnsHSto09j1FZqM6V6LcTdUiS4BBldlYf+TK91CYX3X0CSScEkuoX tL2yZ2MkWGxQzADB9cYHTWwil3kYKmQTKDPFsZuIwbxDmr97YqTrpf6tW A==; X-IronPort-AV: E=Sophos;i="5.51,279,1526313600"; d="scan'208";a="185607651" Received: from mail-co1nam05lp0088.outbound.protection.outlook.com (HELO NAM05-CO1-obe.outbound.protection.outlook.com) ([216.32.181.88]) by ob1.hgst.iphmx.com with ESMTP; 28 Jun 2018 01:45:09 +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=iugC6atpqNXUgJ3fkZK/Wb6KKkWCQNtCqQ1n8ExRzaY=; b=EJv5H/L1H2WCj5YZEc2kqYAamm29etk/IB+h0sWuXJZF35T/NPbCBpfxNK3mNEa1yRC1DzHDLSP+2eYu2SbdUgFi/y5X5wbxNnsJkUrSwXLDC8vIrdTLdwTgNlS1HSCJKoGBaMYxeUT0HJHBW+heIH6DLK4zcmMtQB14EO9mNT0= 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:05 +0000 From: Alistair Francis To: qemu-devel@nongnu.org, peter.maydell@linaro.org, mjc@sifive.com Date: Wed, 27 Jun 2018 10:44:29 -0700 Message-Id: <20180627174435.31800-2-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: 02415bd5-dc2a-4e4a-b7df-08d5dc55b955 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:xpNAX/VPIKLeqfJI93Ee1tEJsSHkWRWpLpmGj1LzKHQDLDht92HSKCJsiQe2m6YUzrK84bFAhXfiv9BqoQ4HQYutBvW7mDoDtQLRZR9qKAg0ldr57GcjH/ah972K7ydj/+OL6OOHncxXsZtgfcCsYNvAXTsCwzXXr1hIuq6LVirXEKCn2BT1JK6I4B1BVMqWAdsEr3zSNbfAsqEKtiIbz7mUTueOOhMhe2iyW1oXB1XhegK+jC0I8RDK5GqP2Q4K; 25:qpTJR3xr0UvP5Z/0nHgXo9Jcy64VgLKm/1hEIJSxj1fyhkvWpnB6UNqYvgvTglv+Ck6dr/YHR88k5JM0ItvFi6LBoqQb9v2a7nKdqtEqJS/lQNLb2l53m+ZQXuWUwTIj68b6XiEOKSmIC82rVSHExRG5T4dNudDWyjGOClzFzJ8jib9P73HcBrgXaTdDAelX/0GNTEmveEQBE8gjizRqZ5HIVoKtXUsukyGSx/+ExmX/dizkZYPlFivwhg7Zhb9TwVinjCwsV+gNF2eqTIGo5940JLZJer2irFkyIqJPsHqxEmcBJL2Qc812OWO9n5AXGngwAh36edyDfvw+aFsjOQ==; 31:P+wlXBUsK1biWJhnA5RoHIK8ZRKuBIZ6jcuKZ35HMg0UYwO5cQ/4a05C3M/7QKdtE4KtYP8XgdSRdU83d9/Gy0oIkmqSXwLqBqvQxCdX6cho4Pp/hVYHpxVRU9tkVleCL4Zy9g0lyPyvMe+/nUEyHjbg12c8S8zm8Yv/cxUx7FasiRPUPHewdBf2WK4nDBRuzXuZUsZR12mSZz+8tw5sr8OSB++66VyoPyQW2L0ds9o= X-MS-TrafficTypeDiagnostic: DM5PR04MB0396: WDCIPOUTBOUND: EOP-TRUE X-Microsoft-Exchange-Diagnostics: 1; DM5PR04MB0396; 20:80R+E7jPsPMX/GGwDkSnNeSnf9J7wWwcboZKQCnSFIEyAi7S9sWXRI2oAsK7iXR813iiNZXzomDSdZsLA4MZ8LvSA3T/eEP1Ehcks9iRX3JVps9zKzXCh4e6HfAz14o0ZFQTn5FK4UEWIWu2hSdOkRXVnmjI5W6p6fpmS6BFO8fKzBGT9l5RRKTOTx1wlPuo6cs6Du8oIqY6aEZjELQ2mt9c+t9fvYYw3YvFjHcwEx/NdMScpsWv7uLS2IrUX99xcCMYeWNb+VGl8WHql0JoLyx03km4jFEe1+mHE+D0dLmqFkPVnRQclyTnNgrFnSWhDrYsI6gxVzMtc95CX4nJkMWuBFr77kqlAJOjFQ54282k0iflCnVFk0uyju484Scxq3e0nNtaGZmGEdgpH/vqDA1LbBl6zJ/tEwVNupV2q8be1mEEJ8TFX+NxCRuzptld+Emwjipv0Ivy2h9EUewqOt2cBQK5pbgew6OAQxKI8VpwGpYcIlV4QulFTfeS/2lD; 4:HwxL1NCSQlZbXkvKQzGbd7OFgwCel201RavA2lTEC/y64Rf3sVUZstpOe79uspL9oMKmEpaMIDTPwksLKQnh63qhsZyJlH1ecDlGpcmlKuzhqo67yU5GrlkBdqiQJ3q/35nXEhJRUHl+YanyHzFEPBK19tt3vtxaMvonROLeE4uuGPC04hZ31M0sO2MO97MhwDPAS9ctT2zpE22gTJVsEJsEe4fI6dBvXnaJlbWoc6JacR+F6uQ+reLlmeMCUHDErWejBD/QqpqwytBQ061mWw== 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)(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:UU2K5o7j40g54jAWBXZWtz3dGZAsDNcHRP2ky3kRp?= q1AQZsKBhg5f3XQpiiisonELyh+dcYhPva/OqqQH/CboCFzrVY1tEQqBaSL0aAU7Ro9o6/EfW5h8pW+MlDo553XDdYetMofKVdpVcvPjd50XRF6qEKrtx2zDLkOlE4FwSwBdhloECeWlYygQJprXygZsmSZ6XULFqz/3g+c2GiwLKUCEfHwDm8YtNq6M8TwACjrQ3we+d6Zv6s7h/tvEVovUAYeJldJhKSjiE8ZKzLj96JDu4M7pJs4PsnMZeCWx0FPvHj1DQ8toq09N44f782lmbQjSMKlLWUEaZhMux6NV8r11UjCNn8R15hVPs64l2qFsXjbxncM2b+QbpGytVEkeaSDF9kJWAZ9znj1c/oXSgtntc42Txj4XIlmrp/W9crGIEuH0yJJDB1Zs5ZSo5tJi4MK/UTrBmsX+MjrfBlg+GfM7dn/ZwrmkUVr0mPpc/7ofmClzfRJwuUiQQbzioHTyukAarPxX39WBJnQXF4FmJ5Fbg+VJpm3YG0f9TiIuLPPUmhaPV7mS8yPPRWHpTGqqsmoh4eK6Iy8+qsrsUVcruB0JeRrh2Zf0a2YNk5aGyo+d6EwXbZWL7zOUSymo+r7BFfGsHwNsTW8l5R/YOMTGM7LfExlzBjqKal/e4ZxhueHum0Iiqz34r4uyTNENarBEFb18+dUAoICSU3s/oN2jxlC885tAjsB9E5nbeYBB9pOejOsrUqugxO+R3IpfaRkC+i8tuM9m5zIqGGKVLkh4DImDGgCTQgo8guGe71kFmD+uhZJyLwCEmSodyGkV7m2RM5w4bfTev+HHGTiywaNVGNFYHF5sk0zunc/LinWGQFisBTjvOs2+bLI3tGEy2brtyzybFsNTFHguEbarNIkcl82M381R06k7dM0hnEuPgLtTAolCtZ+ovyOc/dSlwlIP0rT7p7V6GvufLDkNY8nhaDMA3wD85cYJvOf3VNQhADoDWWOviFRnPJcg0FBgnw03OkXBmpJF4kd/kxaCwThLvOvZj8+V1B/AcV+F3lWysRmyb36sUkzqK5I+yyySxma2xx3MXs21scQmmW97Ai+/Lc3vdhzBRZKa0CFkYytWXbv+y4C7qq3HJno/zvpO/2zyYC2CxmM72IMTqkgTfENNdNhFkX34RCFVYtl2y7ozsQSw2ZDZm830udAiJVQGra27sRojLVeXYhjXr316ACGG45XpL21aLvtjqgWECHqRug= X-Microsoft-Antispam-Message-Info: VNcA6F192/Sjtm2OP7wup7bFH+CUkPsnPAIrf1azttKQe+YlHM/DWjNd4fDys8eQfWVnF1W2MrgRZsq10940yXWQUT9+dl8GzvDZe/nDsb6GRTbI/aKpTK127st6VxX8ZJ+l63LBMyUZrFdcJqQkJiYPRkKXZlZzkce++XLv4dDyv/dsk1wTY4zmWIadie7Hl0u/JbqXFObrQYg0Qpg3Ms73arZEfZbolQr/qQYBh0QlfrKGWw/xYOnIrNMTut8gUHC6UAXOw7/O5pJXb7eZbwMKaTBvQqbcenqT6AjSTKTuxrKHK6bsRXdrl9gvDcPN4VVK0GE/yTBkfXtDUvmlWeLuzzHRNUp0amvcpxIpH6s= X-Microsoft-Exchange-Diagnostics: 1; DM5PR04MB0396; 6:3iYWx6m6ajD1B7VDTZ19Qb9plI3zwdEP2dtIgZG/ZSW9wp34v5pLpVbzGImxOMSXqDyrKcZmunhwQDMMJVHM4ur3Qa45hFJ8jasNNr2Id84viMehOYxgwUBXFIQrZFTyVTj7+rebvI9OBIdcFzRG8FmdrWIdbGf32ZtYkoZzm4fppUcs/fcI4h2hQQ/RtRt5qoL4ug/blngJl5lcvoMIwDMkMrtfhvTHNopJOg/i7wFBBzXz1uw2xv5EywRRM02nqx0VOlSAdZsYKhZuZiee8BvJJx83DcaIa/Tfp7VUvZkb6W6k7wMhBcXgqDEgGzJMsY59ZkTD8kF2nciiNtHg2oPK7AnCyboXVGyuFV2hgANLyD+2TJ5wWUiIY7pQqdhcPvxUwvqkhQq/OyoACLJclveiDrAq91V1e7JxVOkRzqXcGd7zlDIHDNYe1kmC3T2I06iJe51IfhL9SVBh+r594g==; 5:3rSf5rlZXd/5rPHVGmsc/mcUV/p9vEfGCS+A3XgFIMNRrx8BurziQbcUEjsaYfpLhRD0r41955P+RsX2ZY81WJkNQacyoEnnpyJFh+0zabqF8ptFLScwYJs4wIJk7s/pN5317weLmRD1TAWtjdnSa5sZK7MVfMHkHtMQjztGMn4=; 24:W6APBDl1Q3lWDIBUbImmoKUZblzsR2b5YRSXx/6B8tGuAakIbtRVM7BpNiy3tef9Nqu5k2xmJJJ9a3PvzMIlOnlRAhA/HVJ91u5MjvdqGWs= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DM5PR04MB0396; 7:MyfyZL7s3k6eGxNLWlAy4f714gIetcTAMHULhLjkZ+/O9u+PXAd/TEiNQnbwgsjz6+MWDnptgvNQcPJ5qGEEMSoY9jjJf1d8DQPn/+WJNZt1YVYRV//3xsnZOcbXXnEJ9k3gnI0lEZRwdRam2YH/nUAfMSSr3S1ruugghLWYFEWlxEoj8IttDqdZhynjofn872acSjvfYkeJg5k9Hv/OIMgBJz0pVmWSsUjxK4vxyMDplYgvFnf9TJTXkUQxL7ja; 20:ahCZ8dehBp/nqA5y4wvRX9e9CjEAPwqZj0/cCabDs9N7En9lOc1vpytSF33uNMjXlgDlWCJSeMefc0eP3R3G60qXRreH3mB/zUMm2SR0wiN7shPKjpyb2ee/AfXPPwEpYwQ22qHKSbFVhSnU4VRavyFVK+elf4C+lD6imaqBvLs= X-OriginatorOrg: wdc.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jun 2018 17:45:05.0808 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 02415bd5-dc2a-4e4a-b7df-08d5dc55b955 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 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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;