From patchwork Tue Jan 23 22:24:45 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 10181107 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 73F33601D5 for ; Tue, 23 Jan 2018 22:30:57 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6586F28841 for ; Tue, 23 Jan 2018 22:30:57 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4FE8528830; Tue, 23 Jan 2018 22:30:57 +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=-6.8 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, DKIM_SIGNED, 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 14968287A3 for ; Tue, 23 Jan 2018 22:30:55 +0000 (UTC) Received: from localhost ([::1]:57821 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee75j-00044K-1Q for patchwork-qemu-devel@patchwork.kernel.org; Tue, 23 Jan 2018 17:30:55 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38635) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ee74J-00033Z-GX for qemu-devel@nongnu.org; Tue, 23 Jan 2018 17:29:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ee74E-00009e-J0 for qemu-devel@nongnu.org; Tue, 23 Jan 2018 17:29:27 -0500 Received: from mail-cys01nam02on0040.outbound.protection.outlook.com ([104.47.37.40]:45344 helo=NAM02-CY1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ee74E-000076-91 for qemu-devel@nongnu.org; Tue, 23 Jan 2018 17:29:22 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=wWyaNoDr0duRtZJyOBmZ9NbVU4Zqx5RMNqW5FiKyqPw=; b=tqMSmXoze2To8Dyzr0E3FxlXhO0nBVEgvE/OunESZbJOQPi+AAFJK1d/4HV+E0B3/atdfGciP1zRT+RIcCeA3FRp/f1x/S+q8B/piAlfYojQPsXjqZRzUPmdpy4eqTYpkBHfE4R1/c5hDnwBxuRWw5qowyncrDfkR8TwEzz+oXE= Received: from MWHPR0201CA0104.namprd02.prod.outlook.com (10.167.161.45) by BY2PR02MB1331.namprd02.prod.outlook.com (10.162.79.26) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.428.17; Tue, 23 Jan 2018 22:29:12 +0000 Received: from BL2NAM02FT038.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e46::205) by MWHPR0201CA0104.outlook.office365.com (2603:10b6:301:75::45) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.428.17 via Frontend Transport; Tue, 23 Jan 2018 22:29:11 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.83) smtp.mailfrom=xilinx.com; nongnu.org; dkim=none (message not signed) header.d=none;nongnu.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.83 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.83; helo=xsj-pvapsmtpgw01; Received: from xsj-pvapsmtpgw01 (149.199.60.83) by BL2NAM02FT038.mail.protection.outlook.com (10.152.77.25) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.428.12 via Frontend Transport; Tue, 23 Jan 2018 22:29:10 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66] helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw01 with esmtp (Exim 4.63) (envelope-from ) id 1ee742-00068q-6x; Tue, 23 Jan 2018 14:29:10 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1ee742-00088G-6G; Tue, 23 Jan 2018 14:29:10 -0800 Received: from [172.19.2.220] (helo=xsjalistai50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1ee740-000883-7c; Tue, 23 Jan 2018 14:29:08 -0800 From: Alistair Francis To: , Date: Tue, 23 Jan 2018 14:24:45 -0800 Message-ID: <7c26fde24cace1295746fbfc759bdfd5e1e6518a.1516746211.git.alistair.francis@xilinx.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: References: MIME-Version: 1.0 X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23614.006 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.83; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(346002)(396003)(39380400002)(376002)(39860400002)(2980300002)(438002)(199004)(189003)(36756003)(106466001)(4326008)(63266004)(50226002)(77096007)(59450400001)(356003)(81156014)(2870700001)(26005)(81166006)(305945005)(230783001)(2906002)(8936002)(36386004)(106002)(50466002)(336011)(110136005)(2950100002)(8676002)(54906003)(118296001)(6666003)(76176011)(5660300001)(7696005)(478600001)(47776003)(39060400002)(5820100001)(316002)(9786002)(23676004)(107986001); DIR:OUT; SFP:1101; SCL:1; SRVR:BY2PR02MB1331; H:xsj-pvapsmtpgw01; FPR:; SPF:Pass; PTR:unknown-60-83.xilinx.com; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2NAM02FT038; 1:ZqqQFGgvRSI5m/24kM0D+TB6GG5AT3RjI8Qp7LSr3J3Z1dZFJWjdYCwom9HDr3uEO5Yp8sPEnVwqXwfSCh8/KDuHMroJaCu1XW+PHkbg1Z6ETExJgcdGSms2o7zUVA5p X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 686c4a55-7344-4113-9a91-08d562b0b9c5 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(4608076)(2017052603307)(7153060); SRVR:BY2PR02MB1331; X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1331; 3:EyBbWQlDWFs4GlrP7iQW2IwLgb+gTegaMQWg2bb4CYFcCZ3W5KJrr6llxHE5CJcWFlFfGieABp3O2l9X7rfUuMtjUuOZf084ZrShyLKu0ycMSq9X8MmMRmtQFXtfZtGc9rv94AgNOelsTcAzVoBm/4JpXpH65ZEYrZC3YG75zW8/m2E7dZI0TJYhK93/O9Nb5dn5I/kYIrpmQz9ijYSQPVuyJTK44EnlKtvcHH/dAcLi18MSiDTSs4G6getVuQFdvcEm+EYl243jZol9fUpqFylbXtTyBGHuCREvGBPynkJUkBSWD+PMnVlOpMmujafySvFuMnUg1jDrI7E0gVSdshrWn4E4JclbbUUiUmrxddw=; 25:R9dMrDFtMRRgWrk/5C9duvPPINkNPB2wUj136oZb1Tjy8mREMJlFLgb5gafhZDg8Cv3atYMYRSynFcxMILFBdQn9XdCa8VpW3QKNm9aOS87erpNn4ckgTVtMtohJoupEbbK/Zn3U8/zUCVS4hPOVsbOMWV6/+BuKkawvtVoupJrNoDo7MJxiq+vZQrHkjogZQQEGgYUyzuIWGV2RXihPgLWwOsf7JUM0GafaMM4GIAT45mSFyQ01Hfk0eaKDpCn1QcSnyp+yNchG08kXWCntNl6FsSlLGWkPxTQtkHaRopzzQ/5MhzrHwmb9HXK3OoDp0Rbuz8WSIkTyy5liI5tamw== X-MS-TrafficTypeDiagnostic: BY2PR02MB1331: X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1331; 31:z0+bbGAK8zbAInUJJZnKRkokCNulorBzlKkWNe6iE7GCp99F4xHCk/4Oi3jzbaKUAscJp2AVfJGVUlIfKQecjAuRmHEiKn/7cdoE4+0FgdYQNixiSjkDfkGstAqXJtxhtv48aVOjEbxiz8N1BCpvBrEKW8JX/Zw3S4NGM4AREn98UginunPTjiGdleyHSwm0SeO0dMPixsZCprKG+zGxIaLA3Zj8ikHZMco7Jv9stkA=; 20:TnX0lCvXqwo1AwySILizU4TbJEwXb+/+QX0xwVfUm+yU1EZrxyaOswBIPyHwzU77YPgGSiGS1PBrBthnVIUARasw1JGga44gZ/vA9V7PIEm0YrUCg0Cxp8yqbQ6cN2GR++NdfE5GbF4b5df+3GGE7oqSnZ94a9U8aJnup9ZwANyj8H3cHYe05sDnZCKn/QRGIWwBTC51dyRVBY0hj0eL4+5nIflEI2xpQeMOu9zE3VMjigXWhk55rJuc8swh1LYzL1cEerUa97d3B5OgiNlQUF1fo0YRg13MgGKd93JlDw1ENRa/gKo8XIpBtwHcmCU4U1z4TdWDiEq1ELUXBiLaEdCLx8UgQ5cpB5xJKIQ0PsKR0poNsuvQQ0mNwEm2FTN28qIc0Bn2/XbUqcNVwNUn7UatvCpuH3eWWbxWQWFlyecsy7jc9JkCli0qbYvnpLxhjSbHqrgIFZ+eRf60FLuW5i3wqZcoLgnDmvKQsRFdjUYuGGF9oFASpZBD2/IAmQiw X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(3002001)(10201501046)(93006095)(93004095)(3231023)(2400081)(944501161)(6055026)(6041288)(20161123564045)(20161123562045)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(6072148)(201708071742011); SRVR:BY2PR02MB1331; BCL:0; PCL:0; RULEID:; SRVR:BY2PR02MB1331; X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1331; 4:5NvK/8S5nILpXKZjUqstF8WviSC0AVK/BYMP2cNWCF3Q73RYrB+FaFBwOqrgDdjXO+wIGM/28jg2RgeyULWBF0vM01eGFeFseEQ9k39+7WsUzJBTpkFXYzwZL/hh13i7N2PqAmvkPUYdo94AG0vb3R5i6Xv5x3mbVvd9pExpi7k+ElMT9ogQ7hZA1rtraTJ3BBrdvoRj/wWse7ioZTY7n5aXlK5v9hfgZG9lfIe80fGDe1hxIvYqHSm/6zIMS+RVRVIB0gU2KMlCpjhuh0SgH2wywF+jIlUJD3SiW1sRqMgoTJB/d6L5GI8Dyol4x7ly X-Forefront-PRVS: 05610E64EE X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY2PR02MB1331; 23:bHY8SnDf6Dvn/bTgm5TgAij+hT306ZWeoF/d0N2YZ?= =?us-ascii?Q?kvYp52HDiINYybiN8D1m5YlZIs0fsfXb89Qnd4c3xsTHb/NVc5okwObCei1f?= =?us-ascii?Q?3jxacYM1TQQ7SiGY8mJUkUUMjV17VSbxa6LMS+eSLZP9GdXojSs9I4T9SZcx?= =?us-ascii?Q?OwMqjQ+ZTJxNhOxRhdtWRiJ2CMooYPNoYWc69rIzKKhfB32NHTRzJyUGyobT?= =?us-ascii?Q?l66ep+BQnAU2l5OEceerIpbaRDRdvaHDOfivnkRAQzqkFtQ8ch6wuXA3uy3r?= =?us-ascii?Q?RHanaskyk32rEdek07eiLmgUEpwM98UV8mffqsMrokJByfBQYHYADQCpghL1?= =?us-ascii?Q?vkydw2hoLKl+/l9YdubW8S0H2lZNYZBflQLBzj7Mn4h6tXQpZ1e9ezE+qodX?= =?us-ascii?Q?87KJQ8EYXZvwPaz9kxyPPQ/ek+2SnwINRUPOnebyniwL63uQm/GukuDz8OKH?= =?us-ascii?Q?LLmt5xmX9NOBpWiCL06qDSvzljTOl5qi+NTz/NmLTUBFlXO17jltn9NMo4vo?= =?us-ascii?Q?4CFVZyEOwM0AfPCRA/Kmmu/cAavgOekwbItFn6POGyd76qmKAwCuX7sMSSnZ?= =?us-ascii?Q?B7LdTwsEFoKq3nf79WXKrDemS/iloRjtKC2mpUft0QEUsVtiFpQUVa/HUUnT?= =?us-ascii?Q?GDPtL1oNmzG1oYqQ/iOQ6t3knAu3cZxarIl2tIQOBw+p+Gr0OKdnYwTiYOwT?= =?us-ascii?Q?DAfYKK3JEV9VLBL6K6FO8/NR5YcdXYp2zP8pMaSvKKQKS1P6K5ZAO+G75/Pu?= =?us-ascii?Q?s+Cj9zF4DYYwto8C3UrJ/hgtnvwf+pyBkr0ITx7IaAAWcOBJdVvcrrRQCxru?= =?us-ascii?Q?RxaKTcLybP1WAaGw92X2JgaGlfiZcj3OYKjFcmNNB1ztI1DCN7J+7q/drwjW?= =?us-ascii?Q?TXA/6EnnDdk3kFcp3L1pb30oFYbWXWLNM2zbd1opJ3NDk7pUpF5Ig9GIy3VO?= =?us-ascii?Q?U9Ti4WSs4YsC3Hmjy6IZYJn6m7bhdzA4BU2iFGuOWLbMoEub+bMyDVGxki/C?= =?us-ascii?Q?7T7Ul6z6ohHcNaGW7jZ9XgjJyoZDjXW9BmVY/FPjmJMDDgMKMZHziYAuZIoM?= =?us-ascii?Q?swfH26os/0Ia6r9Cs1JMZJwdlHEjnYzVvnzcfsoZIONzMv26A=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY2PR02MB1331; 6:z3kdDlIXOfg5y0gMhHwfrrrdC3CBe3wJU0eU+ufVubANIE4GDzFbwrezZvt5Ycph8xN5bqXQNcOHHKC67JzXS762uV5+aOEm0M/c1yK5M2loEatdmQ1vKn4+hHWgiWwmW1bNzbKCUv4EqvafQ2y2J0GjeTAhmx+JR5zzWDrHGYtS0Vya8i+dJ0Ls8Gay9V6LJtQEuBKdwsAa21YDnfbNF793KI/avRn+o8mbpHhy1MXXIIp30vwfie8/tuKciqn6k0LmiaH1QqK8NfU+DYX/uuedobjiY5rp6GpPHc4U5zuLhOdDqpIE7XWYMgyBJZNBbxiL/+PxZOvogAr3EhqMNZu4xA3PE0TWQFsJDqd1/7o=; 5:x/j9s9UDDXB8uT+A4S2R7DgUdD1vZyZpElNND62Rm4tq6aSrdqMwovjS0hnlE5RRDB5WdUlw8MqPPdwgofp7ix8kdhI3JHyiNWQr7uIkn5waxgZynrUkzL7hcjUVUd44FuPPdyYQRNP+q0nh+Y/6VB861dTfF0TG3T9n2r5Zk7k=; 24:DUTLNU0X13GB44j5TE4D8oLTPlTwKmdVV+oZumW5oousd2nFRLidwm8A35u6YwrAJMhhG8qjCvzxgDSP8vwhkIjPUv8UBR+9J67yxww/x+U=; 7:Rb4+qVGiT3Kiq90g7DMzV//R2itMXsTTihUAhORxLFzVddVNbX5czSdJVjoOv4cXbrkbSu2dUupYM2F6mexn/w3i+fMC5MkWy7n458Fwj3F7aFisMHR+7JUqI5JtrG+VEB+uuUQn1cCSrlkJ4SiH7MR1rkYTZ3ht9hVsyxT5cLJOPoZpa5z2skyYZT0dvhi6bnVJcrDOx0g377Yl4598sajlc+wB4QRQw0FGVGgwJFU32miw8ghcXB4zCohdrVS+ SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Jan 2018 22:29:10.9856 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 686c4a55-7344-4113-9a91-08d562b0b9c5 X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.83]; Helo=[xsj-pvapsmtpgw01] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR02MB1331 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.37.40 Subject: [Qemu-devel] [PATCH v5 1/3] xlnx-zynqmp-rtc: Initial commit 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: edgar.iglesias@xilinx.com, alistair23@gmail.com, edgar.iglesias@gmail.com, f4bug@amsat.org, alistair.francis@xilinx.com Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP Initial commit of the ZynqMP RTC device. Signed-off-by: Alistair Francis Reviewed-by: Philippe Mathieu-Daudé --- v5: - Don't use intermediate val V2: - Delete unused realise function - Remove DB_PRINT() include/hw/timer/xlnx-zynqmp-rtc.h | 84 +++++++++++++++ hw/timer/xlnx-zynqmp-rtc.c | 214 +++++++++++++++++++++++++++++++++++++ hw/timer/Makefile.objs | 1 + 3 files changed, 299 insertions(+) create mode 100644 include/hw/timer/xlnx-zynqmp-rtc.h create mode 100644 hw/timer/xlnx-zynqmp-rtc.c diff --git a/include/hw/timer/xlnx-zynqmp-rtc.h b/include/hw/timer/xlnx-zynqmp-rtc.h new file mode 100644 index 0000000000..87649836cc --- /dev/null +++ b/include/hw/timer/xlnx-zynqmp-rtc.h @@ -0,0 +1,84 @@ +/* + * QEMU model of the Xilinx ZynqMP Real Time Clock (RTC). + * + * Copyright (c) 2017 Xilinx Inc. + * + * Written-by: Alistair Francis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "hw/register.h" + +#define TYPE_XLNX_ZYNQMP_RTC "xlnx-zynmp.rtc" + +#define XLNX_ZYNQMP_RTC(obj) \ + OBJECT_CHECK(XlnxZynqMPRTC, (obj), TYPE_XLNX_ZYNQMP_RTC) + +REG32(SET_TIME_WRITE, 0x0) +REG32(SET_TIME_READ, 0x4) +REG32(CALIB_WRITE, 0x8) + FIELD(CALIB_WRITE, FRACTION_EN, 20, 1) + FIELD(CALIB_WRITE, FRACTION_DATA, 16, 4) + FIELD(CALIB_WRITE, MAX_TICK, 0, 16) +REG32(CALIB_READ, 0xc) + FIELD(CALIB_READ, FRACTION_EN, 20, 1) + FIELD(CALIB_READ, FRACTION_DATA, 16, 4) + FIELD(CALIB_READ, MAX_TICK, 0, 16) +REG32(CURRENT_TIME, 0x10) +REG32(CURRENT_TICK, 0x14) + FIELD(CURRENT_TICK, VALUE, 0, 16) +REG32(ALARM, 0x18) +REG32(RTC_INT_STATUS, 0x20) + FIELD(RTC_INT_STATUS, ALARM, 1, 1) + FIELD(RTC_INT_STATUS, SECONDS, 0, 1) +REG32(RTC_INT_MASK, 0x24) + FIELD(RTC_INT_MASK, ALARM, 1, 1) + FIELD(RTC_INT_MASK, SECONDS, 0, 1) +REG32(RTC_INT_EN, 0x28) + FIELD(RTC_INT_EN, ALARM, 1, 1) + FIELD(RTC_INT_EN, SECONDS, 0, 1) +REG32(RTC_INT_DIS, 0x2c) + FIELD(RTC_INT_DIS, ALARM, 1, 1) + FIELD(RTC_INT_DIS, SECONDS, 0, 1) +REG32(ADDR_ERROR, 0x30) + FIELD(ADDR_ERROR, STATUS, 0, 1) +REG32(ADDR_ERROR_INT_MASK, 0x34) + FIELD(ADDR_ERROR_INT_MASK, MASK, 0, 1) +REG32(ADDR_ERROR_INT_EN, 0x38) + FIELD(ADDR_ERROR_INT_EN, MASK, 0, 1) +REG32(ADDR_ERROR_INT_DIS, 0x3c) + FIELD(ADDR_ERROR_INT_DIS, MASK, 0, 1) +REG32(CONTROL, 0x40) + FIELD(CONTROL, BATTERY_DISABLE, 31, 1) + FIELD(CONTROL, OSC_CNTRL, 24, 4) + FIELD(CONTROL, SLVERR_ENABLE, 0, 1) +REG32(SAFETY_CHK, 0x50) + +#define XLNX_ZYNQMP_RTC_R_MAX (R_SAFETY_CHK + 1) + +typedef struct XlnxZynqMPRTC { + SysBusDevice parent_obj; + MemoryRegion iomem; + qemu_irq irq_rtc_int; + qemu_irq irq_addr_error_int; + + uint32_t regs[XLNX_ZYNQMP_RTC_R_MAX]; + RegisterInfo regs_info[XLNX_ZYNQMP_RTC_R_MAX]; +} XlnxZynqMPRTC; diff --git a/hw/timer/xlnx-zynqmp-rtc.c b/hw/timer/xlnx-zynqmp-rtc.c new file mode 100644 index 0000000000..707f145027 --- /dev/null +++ b/hw/timer/xlnx-zynqmp-rtc.c @@ -0,0 +1,214 @@ +/* + * QEMU model of the Xilinx ZynqMP Real Time Clock (RTC). + * + * Copyright (c) 2017 Xilinx Inc. + * + * Written-by: Alistair Francis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "qemu/osdep.h" +#include "hw/sysbus.h" +#include "hw/register.h" +#include "qemu/bitops.h" +#include "qemu/log.h" +#include "hw/timer/xlnx-zynqmp-rtc.h" + +#ifndef XLNX_ZYNQMP_RTC_ERR_DEBUG +#define XLNX_ZYNQMP_RTC_ERR_DEBUG 0 +#endif + +static void rtc_int_update_irq(XlnxZynqMPRTC *s) +{ + bool pending = s->regs[R_RTC_INT_STATUS] & ~s->regs[R_RTC_INT_MASK]; + qemu_set_irq(s->irq_rtc_int, pending); +} + +static void addr_error_int_update_irq(XlnxZynqMPRTC *s) +{ + bool pending = s->regs[R_ADDR_ERROR] & ~s->regs[R_ADDR_ERROR_INT_MASK]; + qemu_set_irq(s->irq_addr_error_int, pending); +} + +static void rtc_int_status_postw(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); + rtc_int_update_irq(s); +} + +static uint64_t rtc_int_en_prew(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_RTC_INT_MASK] &= (uint32_t) ~val64; + rtc_int_update_irq(s); + return 0; +} + +static uint64_t rtc_int_dis_prew(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_RTC_INT_MASK] |= (uint32_t) val64; + rtc_int_update_irq(s); + return 0; +} + +static void addr_error_postw(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); + addr_error_int_update_irq(s); +} + +static uint64_t addr_error_int_en_prew(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_ADDR_ERROR_INT_MASK] &= (uint32_t) ~val64; + addr_error_int_update_irq(s); + return 0; +} + +static uint64_t addr_error_int_dis_prew(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_ADDR_ERROR_INT_MASK] |= (uint32_t) val64; + addr_error_int_update_irq(s); + return 0; +} + +static const RegisterAccessInfo rtc_regs_info[] = { + { .name = "SET_TIME_WRITE", .addr = A_SET_TIME_WRITE, + },{ .name = "SET_TIME_READ", .addr = A_SET_TIME_READ, + .ro = 0xffffffff, + },{ .name = "CALIB_WRITE", .addr = A_CALIB_WRITE, + },{ .name = "CALIB_READ", .addr = A_CALIB_READ, + .ro = 0x1fffff, + },{ .name = "CURRENT_TIME", .addr = A_CURRENT_TIME, + .ro = 0xffffffff, + },{ .name = "CURRENT_TICK", .addr = A_CURRENT_TICK, + .ro = 0xffff, + },{ .name = "ALARM", .addr = A_ALARM, + },{ .name = "RTC_INT_STATUS", .addr = A_RTC_INT_STATUS, + .w1c = 0x3, + .post_write = rtc_int_status_postw, + },{ .name = "RTC_INT_MASK", .addr = A_RTC_INT_MASK, + .reset = 0x3, + .ro = 0x3, + },{ .name = "RTC_INT_EN", .addr = A_RTC_INT_EN, + .pre_write = rtc_int_en_prew, + },{ .name = "RTC_INT_DIS", .addr = A_RTC_INT_DIS, + .pre_write = rtc_int_dis_prew, + },{ .name = "ADDR_ERROR", .addr = A_ADDR_ERROR, + .w1c = 0x1, + .post_write = addr_error_postw, + },{ .name = "ADDR_ERROR_INT_MASK", .addr = A_ADDR_ERROR_INT_MASK, + .reset = 0x1, + .ro = 0x1, + },{ .name = "ADDR_ERROR_INT_EN", .addr = A_ADDR_ERROR_INT_EN, + .pre_write = addr_error_int_en_prew, + },{ .name = "ADDR_ERROR_INT_DIS", .addr = A_ADDR_ERROR_INT_DIS, + .pre_write = addr_error_int_dis_prew, + },{ .name = "CONTROL", .addr = A_CONTROL, + .reset = 0x1000000, + .rsvd = 0x70fffffe, + },{ .name = "SAFETY_CHK", .addr = A_SAFETY_CHK, + } +}; + +static void rtc_reset(DeviceState *dev) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(dev); + unsigned int i; + + for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) { + register_reset(&s->regs_info[i]); + } + + rtc_int_update_irq(s); + addr_error_int_update_irq(s); +} + +static const MemoryRegionOps rtc_ops = { + .read = register_read_memory, + .write = register_write_memory, + .endianness = DEVICE_LITTLE_ENDIAN, + .valid = { + .min_access_size = 4, + .max_access_size = 4, + }, +}; + +static void rtc_init(Object *obj) +{ + XlnxZynqMPRTC *s = XLNX_ZYNQMP_RTC(obj); + SysBusDevice *sbd = SYS_BUS_DEVICE(obj); + RegisterInfoArray *reg_array; + + memory_region_init(&s->iomem, obj, TYPE_XLNX_ZYNQMP_RTC, + XLNX_ZYNQMP_RTC_R_MAX * 4); + reg_array = + register_init_block32(DEVICE(obj), rtc_regs_info, + ARRAY_SIZE(rtc_regs_info), + s->regs_info, s->regs, + &rtc_ops, + XLNX_ZYNQMP_RTC_ERR_DEBUG, + XLNX_ZYNQMP_RTC_R_MAX * 4); + memory_region_add_subregion(&s->iomem, + 0x0, + ®_array->mem); + sysbus_init_mmio(sbd, &s->iomem); + sysbus_init_irq(sbd, &s->irq_rtc_int); + sysbus_init_irq(sbd, &s->irq_addr_error_int); +} + +static const VMStateDescription vmstate_rtc = { + .name = TYPE_XLNX_ZYNQMP_RTC, + .version_id = 1, + .minimum_version_id = 1, + .fields = (VMStateField[]) { + VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPRTC, XLNX_ZYNQMP_RTC_R_MAX), + VMSTATE_END_OF_LIST(), + } +}; + +static void rtc_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + + dc->reset = rtc_reset; + dc->vmsd = &vmstate_rtc; +} + +static const TypeInfo rtc_info = { + .name = TYPE_XLNX_ZYNQMP_RTC, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(XlnxZynqMPRTC), + .class_init = rtc_class_init, + .instance_init = rtc_init, +}; + +static void rtc_register_types(void) +{ + type_register_static(&rtc_info); +} + +type_init(rtc_register_types) diff --git a/hw/timer/Makefile.objs b/hw/timer/Makefile.objs index 8c19eac3b6..8b27a4b7ef 100644 --- a/hw/timer/Makefile.objs +++ b/hw/timer/Makefile.objs @@ -21,6 +21,7 @@ common-obj-$(CONFIG_IMX) += imx_epit.o common-obj-$(CONFIG_IMX) += imx_gpt.o common-obj-$(CONFIG_LM32) += lm32_timer.o common-obj-$(CONFIG_MILKYMIST) += milkymist-sysctl.o +common-obj-$(CONFIG_XLNX_ZYNQMP) += xlnx-zynqmp-rtc.o obj-$(CONFIG_ALTERA_TIMER) += altera_timer.o obj-$(CONFIG_EXYNOS4) += exynos4210_mct.o