From nobody Fri Oct 24 09:59:42 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1519406885600995.4547413567432; Fri, 23 Feb 2018 09:28:05 -0800 (PST) Received: from localhost ([::1]:46285 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1epH8d-0001iF-Gc for importer@patchew.org; Fri, 23 Feb 2018 12:28:03 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35241) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1epH6m-0000U2-UD for qemu-devel@nongnu.org; Fri, 23 Feb 2018 12:26:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1epH6j-0004Cq-Hw for qemu-devel@nongnu.org; Fri, 23 Feb 2018 12:26:08 -0500 Received: from mail-sn1nam01on0041.outbound.protection.outlook.com ([104.47.32.41]:13664 helo=NAM01-SN1-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 1epH6i-0004AG-Rt for qemu-devel@nongnu.org; Fri, 23 Feb 2018 12:26:05 -0500 Received: from MWHPR02CA0042.namprd02.prod.outlook.com (10.164.133.31) by DM5PR02MB3161.namprd02.prod.outlook.com (10.164.143.138) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.527.15; Fri, 23 Feb 2018 17:26:01 +0000 Received: from SN1NAM02FT052.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e44::200) by MWHPR02CA0042.outlook.office365.com (2603:10b6:301:60::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.527.15 via Frontend Transport; Fri, 23 Feb 2018 17:26:01 +0000 Received: from xsj-pvapsmtpgw02 (149.199.60.100) by SN1NAM02FT052.mail.protection.outlook.com (10.152.72.146) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.527.18 via Frontend Transport; Fri, 23 Feb 2018 17:26:00 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:37662 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1epH6e-0000hq-CD; Fri, 23 Feb 2018 09:26:00 -0800 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1epH6e-0001rs-9g; Fri, 23 Feb 2018 09:26:00 -0800 Received: from xsj-pvapsmtp01 (xsj-smtp.xilinx.com [149.199.38.66]) by xsj-smtp-dlp1.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id w1NHPs0N002299; Fri, 23 Feb 2018 09:25:54 -0800 Received: from [172.19.2.220] (helo=xsjalistai50.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1epH6Y-0001qa-8V; Fri, 23 Feb 2018 09:25:54 -0800 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=Rj6UtCJEuZ82yhf1qtiZLTzWyv3wii/0RLqYSqGFlDnF8/gxn8U+GstJFBNVhJdGl6OEYUGXEUckDyG+gg35P3O0D26VSWCrbH5+ypgJwGhv5C9PPaoOyb18yMOC/XjFGikojXyKo7pkqLSYp7V+AiKwb8V/Ex+TqxqduHRIthM= Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; amsat.org; dkim=none (message not signed) header.d=none;amsat.org; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.100 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.100; helo=xsj-pvapsmtpgw02; From: Alistair Francis To: , Date: Fri, 23 Feb 2018 09:21:19 -0800 Message-ID: X-Mailer: git-send-email 2.14.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.2.0.1013-23620.005 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.100; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(39380400002)(396003)(346002)(376002)(39860400002)(2980300002)(438002)(199004)(189003)(50466002)(63266004)(110136005)(316002)(54906003)(106002)(59450400001)(356003)(106466001)(76176011)(305945005)(36756003)(118296001)(5820100001)(186003)(336011)(47776003)(4326008)(26005)(77096007)(39060400002)(81166006)(81156014)(7696005)(23676004)(9786002)(5660300001)(478600001)(50226002)(36386004)(8936002)(8676002)(6666003)(2870700001)(2950100002)(2906002)(107986001)(5001870100001); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR02MB3161; H:xsj-pvapsmtpgw02; FPR:; SPF:Pass; PTR:xapps1.xilinx.com,unknown-60-100.xilinx.com; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; SN1NAM02FT052; 1:2wFpEW8/SwnGiMqz6OvL3jXoFTjemsisFD9zuIdXWG8yLhWQEvG48grFm8jPoX9PddQD6rsepp5L21xD51dmyIDnjCCfNIqSrOIDs3HLurF3WtIcmCRO6PIe2P5ZYrRy X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: c8cab68f-ff4c-418d-c054-08d57ae2825b X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(4534165)(4627221)(201703031133081)(201702281549075)(5600026)(4604075)(4608076)(2017052603307)(7153060); SRVR:DM5PR02MB3161; X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB3161; 3:jL0vn3/jGRXYVwN6YSSMqraKTcjy/AeRhr/CAMxVlvuwCV7fVNFslzReql2MV9V0DFYyAQM3sPJiEEbm5Rhbwkor+h4n6n2WVpBVmejgKkmf5CGSmdbQMX+MztcMGidPhDUK9qt8H+G1g26ONfz35DM2hF0kRDuHx1M0TbjvTluUqij/OARm/TQepMxB+lyfIxdkwbj7auHIRzWeJ78X+PSlr4F9TZZ+GvDDdYAL+xB8ajpWolXVvd3CB1ZRHRNeR5M7mi7bz60oEe7dk8YAb7ryl9p+qaZGAPYtP4sm3PsLjhzjvEII1fZ84LpZcuj7ZmCg+iXBE6XteT66Fx5iJW2obOeuXZp9f9w9IL3DTgY=; 25:Ug4/blTYtpzWsBLqFMly5TNtoUgFbZvcN8UgURRbSOil93dfsgYHLn0kzn4uTf4csnr4NxG+U8G4JLT+AnGIXY0N7p6sp5cIBIF6htPVVtuE7PkLRG03/IMqm74XqyY6B9suV9ADQGhWv0RfcThgXrY1YVLnwawbj008vRbHIxbkUUOPr4fBuuNOmRMgILFa5PGd/v3Em0oDpFfUWPRsj5NRoL3XlUyDF6p8O875Rvy4r4N/aKuWy80Ss0k0K328ML6I5R1OuCp5h+mQkA4ZtlMx8YV1r4Yx36tnY2a1eVRsmtch+Nvw2wzBMIpQ2TD7k/U/a4fzsKBRlQ2VQM/SUg== X-MS-TrafficTypeDiagnostic: DM5PR02MB3161: X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB3161; 31:S0zKqnxtUsd1yAHBlMTVS8zKupIiqauami4snIflvKb8h0t6bAjrO99u4P84FZvftWN6SzqN8KWYpkdrkU9SIerIqLktbyGkRsyTZ0CNFAdvRXImn9VK0fZxLC4/mI5jxoKZYVoc61Z038cEx9WfBwlaCGlRmTo7fkqvYnTTn7CnMa5gnNYP3bVvfG99jPY+HsCkM8oPh7B5Hcdw7tdaII1r5KVnjwVqeiCiO/FPedI=; 20:c5EFq7wmWLVJRQNI593wpcDU9GLxGKA9dSpocO7gzA2HZRz8G30Q65RoeJgicoQZwQSv0FI2ioCTah3KHXMZIK/AZU4l8Ihz3YTz5/IENqWwiS3gYUE1Y2eIV3VGfXJ/8JF7JrU5DjmAqFpn/DEWSma5kb0mijpbMfyz9w/sR0Xl9wPNan3YH2Lb4AaqmXJACIBQke5cDFoNccrW+2sRk0LnmCYgJ+SZgwuYIGxgSHAyYcUAb9g+Xmw9Dupahm3J3a4fGWPZacLIlCRXEt+xB4NULBNRCwKdYxKAwZXTszazaPpfRzyPGp1ENIljR3wgLeqcCVkXcqxPN1GXyOr42Fan2vb4GE6iRqON33ZGH2bjOFdslYZACv8uCsJt1ebOR53OCjhCtoxeb8Zod5uZmWKm7FU8eYhKoL6sQd+TwCd1FX/LhUAqGWEGfllt2LuRFDGGtlCpXhjTzCqZzKnCaUDj/1BzVAF97TVEWxGqQnS/f9Hdax3pe3Rrxkb0p49n 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:(8211001083)(6040501)(2401047)(5005006)(8121501046)(3231101)(944501161)(3002001)(93006095)(93004095)(10201501046)(6055026)(6041288)(20161123558120)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123562045)(6072148)(201708071742011); SRVR:DM5PR02MB3161; BCL:0; PCL:0; RULEID:; SRVR:DM5PR02MB3161; X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB3161; 4:/6y/7SPta63ZTWUY+yeUdReyJzUsXb9chsCPqMNTJeXK2pZ8o07+9rCpM6bxi9E9WDcR+/MpjJAX5j2LLcBP7/iR/wVKRpwKRZojNO0XsimUmbS+2TL+0UKbv7d1POsqcmi27WWGtnxHAIvnQE+cr/A9igMLyUYVyTkViv17/m5ab+qz+SiIoMf8rC6w+NX0iK/SSk6vgD7/puimarT87xUCR1uB+MB93+arOVL4jbEmyvbLWSJ4KtQnWaHyRQSEGm0bi0cjCSx9AgtwLeKp8vXyMakOObmgCRLnBqn3KtUuLAjQM5opHcvwJlgpki7V X-Forefront-PRVS: 0592A9FDE6 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR02MB3161; 23:V3EV0c5aIrnSThu6g2PjkgEBT/92S2VvJwe5hgnP/?= =?us-ascii?Q?OMKmYOTmiVvCqvBIuae7n+RD5LEQz6aMarQ7/JjYXylfFSBom4PfC16FqEZc?= =?us-ascii?Q?VVt+7evpoyQV2NQ+BBj43xOwymgLO4RfuPpD8iD8TMf16PN3X1QbachYKewY?= =?us-ascii?Q?tFmNm4MBmLz/vTmkZW6SzgsKrmbs5vwfpyfmDQw7SQvnCjtgHsjAaKR0QN/9?= =?us-ascii?Q?1jzfJmEaFphUEvae/75mjuO/gJgoZHuybWTaAkceCY9Gny5XF0EYMIA9dTTt?= =?us-ascii?Q?7aLPJOm3PWy/R5STkjlRvhEeLIWmIJwV5Lv0KUUWXshBDArL0PVHIGgyqKZT?= =?us-ascii?Q?w5626mEl/ttBnVDVYPU2ygyp9+nmITXzJulCTtI1DYBAvm9UdwWOXWKFskwn?= =?us-ascii?Q?4ZWwpis52Ww+TbPGI7EVkyu+EtxZ1E6f1wDRR/j/tY2k2wOp7F+0N9PlhpED?= =?us-ascii?Q?lHfHwOsUU2/6q+avmbPtuXtdNPGcY4k90/rqhj7W6MoTCz0gvHm6CVmEUVWm?= =?us-ascii?Q?1e2dEAr2Q4Gmh3fM/kpk+rWgR7Fl8GcPnEj20Z7OjezCFgQAkMLjpg8tAXvf?= =?us-ascii?Q?KCQrGzi0gXrauWmluo40PCWkH1J5rPglo79Xnko+J5A7KV5Oo0jjIY/bQjt5?= =?us-ascii?Q?5mtUCQlrAlxGU6NJ7DBPthUsFMdtglUQt3Vz6yEdLPFNKcySsc22i+9fJs0q?= =?us-ascii?Q?RmBpl4VuJiNpqGGeD/zcK+8+Um5HuOTPI2Ki56TAv/LH+ls50dpWnfc8Zw3F?= =?us-ascii?Q?4QPIuEAXqZfNk7rmq4PrMIur043Ir5trKboFEGvKcwdFF1eHqaUg5WVSQcIh?= =?us-ascii?Q?A3W70T+3FtbgFcVbgeLCSrL7H0+Kwzh1IBmPYfEOShVL5mIHGHnvK2YtQKl4?= =?us-ascii?Q?ziiwHP78crmzxuw9AdOg4t/MdinVI5GoCkGYt/oG9o76y622ZHeg7/Q7eIo8?= =?us-ascii?Q?liS9uivkHeMY2PibLy06V8LivpUVXHdk9OVmCGYXJzhdNYS+p+2kbImYKx3T?= =?us-ascii?Q?JUwlRvwUjhO52v5tonsWxLjLoaKP8YukqesVKECkYMA3soKUAsnd45gmLl1G?= =?us-ascii?Q?G+i5VVUlJ9M9bUqkvGjXeaR7xLUMv+9d/7SzT56o5gTP6pdwXqJ/iOUHXdXy?= =?us-ascii?Q?Gx7V7phMZU=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR02MB3161; 6:WZIG92YQvnM1usqX+KLOtMlhcwrl6TJpk7wiFOTC8QNGLjvHkwvo8m+2mdMI5yjDJnA2q0DtdynsrbD1oQpo3OIkRe2jMG+KL8QAsb1W56ool99nT21Oc7VxhXCpuxOSrM0CR/AUPXNg/C1FvRha6+Jjwe5yrre0kU4pKBwd500Bv3halW7GtaxDP/UBGZSHHMpgwbFlV9n8Cw7sOKaoyICfEKNOHVPXoeW3QS6Q+e1axCxDZikwnqJBO0kLb+CUz2EJXJp128EKcTTuZAwu3yKEWLuBq3lAshtHzIV3KfjjMkfG3JCpjJYZwhnrKF1WLF6ibBtJ/nGgh4/RYvvij5jZ6UEAl6LVzIuFWSpNJy8=; 5:Tee/9WqCHGfRAQAIOP8vv6I1xTPGovY3l8ud8JE8ZXPoLkmGPn/oN8lTQ1QLwATrhIAK2A8Z7S5xrFXXoiJFmYXFrL6lrraZLe6ska3m2Pivn8Xf856dF8Vj61zBudRvX68jcD6nXYWPxChUDyQzbJjsEZjlpGfOqNqQfa1C8+4=; 24:+SlN7OMTo2rIYNLUQwvOweT2cDBGzSQQ/riabIxCa+ObEwR8LAZefYy9+ik2cVeCx6JCcxa3BFbn27tzZy3RQVcrUq8IPciATRgF4nJk82U=; 7:YIx2o8zCxzvfTc8M3IJ1KB7XofbttMTH2EeAx2Au6jZV5KVQjbmdK7zhFsru1D6jKb1118elyHPMQEFU8D2dYjciLPXdiuj2eu3JUVfGtHC8Mkkwy0rkHnDkgRJFQ0QhCxWR9rmGcmq/JCgLgYzHJd0wV4vGRWywyUDj4HgrcEWH6WchrTAUlHhhltldIk5OFQDiS+x4/k2NC/JTnvwPugqbtHCa9k1kq5q1Ea46KpNxGww8v8VRkC+C60w2bxjo SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Feb 2018 17:26:00.7760 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c8cab68f-ff4c-418d-c054-08d57ae2825b 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.100]; Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR02MB3161 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.32.41 Subject: [Qemu-devel] [PATCH v6 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+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Initial commit of the ZynqMP RTC device. Signed-off-by: Alistair Francis Reviewed-by: Philippe Mathieu-Daud=C3=A9 --- 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-zyn= qmp-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"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * 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 OT= HER + * 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"), t= o deal + * in the Software without restriction, including without limitation the r= ights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or se= ll + * 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 OT= HER + * 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 =3D 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 =3D s->regs[R_ADDR_ERROR] & ~s->regs[R_ADDR_ERROR_INT_MAS= K]; + qemu_set_irq(s->irq_addr_error_int, pending); +} + +static void rtc_int_status_postw(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s =3D XLNX_ZYNQMP_RTC(reg->opaque); + rtc_int_update_irq(s); +} + +static uint64_t rtc_int_en_prew(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s =3D XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_RTC_INT_MASK] &=3D (uint32_t) ~val64; + rtc_int_update_irq(s); + return 0; +} + +static uint64_t rtc_int_dis_prew(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s =3D XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_RTC_INT_MASK] |=3D (uint32_t) val64; + rtc_int_update_irq(s); + return 0; +} + +static void addr_error_postw(RegisterInfo *reg, uint64_t val64) +{ + XlnxZynqMPRTC *s =3D 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 =3D XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_ADDR_ERROR_INT_MASK] &=3D (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 =3D XLNX_ZYNQMP_RTC(reg->opaque); + + s->regs[R_ADDR_ERROR_INT_MASK] |=3D (uint32_t) val64; + addr_error_int_update_irq(s); + return 0; +} + +static const RegisterAccessInfo rtc_regs_info[] =3D { + { .name =3D "SET_TIME_WRITE", .addr =3D A_SET_TIME_WRITE, + },{ .name =3D "SET_TIME_READ", .addr =3D A_SET_TIME_READ, + .ro =3D 0xffffffff, + },{ .name =3D "CALIB_WRITE", .addr =3D A_CALIB_WRITE, + },{ .name =3D "CALIB_READ", .addr =3D A_CALIB_READ, + .ro =3D 0x1fffff, + },{ .name =3D "CURRENT_TIME", .addr =3D A_CURRENT_TIME, + .ro =3D 0xffffffff, + },{ .name =3D "CURRENT_TICK", .addr =3D A_CURRENT_TICK, + .ro =3D 0xffff, + },{ .name =3D "ALARM", .addr =3D A_ALARM, + },{ .name =3D "RTC_INT_STATUS", .addr =3D A_RTC_INT_STATUS, + .w1c =3D 0x3, + .post_write =3D rtc_int_status_postw, + },{ .name =3D "RTC_INT_MASK", .addr =3D A_RTC_INT_MASK, + .reset =3D 0x3, + .ro =3D 0x3, + },{ .name =3D "RTC_INT_EN", .addr =3D A_RTC_INT_EN, + .pre_write =3D rtc_int_en_prew, + },{ .name =3D "RTC_INT_DIS", .addr =3D A_RTC_INT_DIS, + .pre_write =3D rtc_int_dis_prew, + },{ .name =3D "ADDR_ERROR", .addr =3D A_ADDR_ERROR, + .w1c =3D 0x1, + .post_write =3D addr_error_postw, + },{ .name =3D "ADDR_ERROR_INT_MASK", .addr =3D A_ADDR_ERROR_INT_MASK, + .reset =3D 0x1, + .ro =3D 0x1, + },{ .name =3D "ADDR_ERROR_INT_EN", .addr =3D A_ADDR_ERROR_INT_EN, + .pre_write =3D addr_error_int_en_prew, + },{ .name =3D "ADDR_ERROR_INT_DIS", .addr =3D A_ADDR_ERROR_INT_DIS, + .pre_write =3D addr_error_int_dis_prew, + },{ .name =3D "CONTROL", .addr =3D A_CONTROL, + .reset =3D 0x1000000, + .rsvd =3D 0x70fffffe, + },{ .name =3D "SAFETY_CHK", .addr =3D A_SAFETY_CHK, + } +}; + +static void rtc_reset(DeviceState *dev) +{ + XlnxZynqMPRTC *s =3D XLNX_ZYNQMP_RTC(dev); + unsigned int i; + + for (i =3D 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 =3D { + .read =3D register_read_memory, + .write =3D register_write_memory, + .endianness =3D DEVICE_LITTLE_ENDIAN, + .valid =3D { + .min_access_size =3D 4, + .max_access_size =3D 4, + }, +}; + +static void rtc_init(Object *obj) +{ + XlnxZynqMPRTC *s =3D XLNX_ZYNQMP_RTC(obj); + SysBusDevice *sbd =3D 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 =3D + 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 =3D { + .name =3D TYPE_XLNX_ZYNQMP_RTC, + .version_id =3D 1, + .minimum_version_id =3D 1, + .fields =3D (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 =3D DEVICE_CLASS(klass); + + dc->reset =3D rtc_reset; + dc->vmsd =3D &vmstate_rtc; +} + +static const TypeInfo rtc_info =3D { + .name =3D TYPE_XLNX_ZYNQMP_RTC, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(XlnxZynqMPRTC), + .class_init =3D rtc_class_init, + .instance_init =3D 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) +=3D imx_epit.o common-obj-$(CONFIG_IMX) +=3D imx_gpt.o common-obj-$(CONFIG_LM32) +=3D lm32_timer.o common-obj-$(CONFIG_MILKYMIST) +=3D milkymist-sysctl.o +common-obj-$(CONFIG_XLNX_ZYNQMP) +=3D xlnx-zynqmp-rtc.o =20 obj-$(CONFIG_ALTERA_TIMER) +=3D altera_timer.o obj-$(CONFIG_EXYNOS4) +=3D exynos4210_mct.o --=20 2.14.1