From patchwork Fri Feb 23 17:21:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Alistair Francis X-Patchwork-Id: 877207 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; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="Rj6UtCJE"; 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 3znyns4PMbz9s0t for ; Sat, 24 Feb 2018 04:26:57 +1100 (AEDT) Received: from localhost ([::1]:46279 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1epH7X-0000WS-Lj for incoming@patchwork.ozlabs.org; Fri, 23 Feb 2018 12:26:55 -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 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= 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 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 (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; 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 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 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/?= OMKmYOTmiVvCqvBIuae7n+RD5LEQz6aMarQ7/JjYXylfFSBom4PfC16FqEZcVVt+7evpoyQV2NQ+BBj43xOwymgLO4RfuPpD8iD8TMf16PN3X1QbachYKewYtFmNm4MBmLz/vTmkZW6SzgsKrmbs5vwfpyfmDQw7SQvnCjtgHsjAaKR0QN/91jzfJmEaFphUEvae/75mjuO/gJgoZHuybWTaAkceCY9Gny5XF0EYMIA9dTTt7aLPJOm3PWy/R5STkjlRvhEeLIWmIJwV5Lv0KUUWXshBDArL0PVHIGgyqKZTw5626mEl/ttBnVDVYPU2ygyp9+nmITXzJulCTtI1DYBAvm9UdwWOXWKFskwn4ZWwpis52Ww+TbPGI7EVkyu+EtxZ1E6f1wDRR/j/tY2k2wOp7F+0N9PlhpEDlHfHwOsUU2/6q+avmbPtuXtdNPGcY4k90/rqhj7W6MoTCz0gvHm6CVmEUVWm1e2dEAr2Q4Gmh3fM/kpk+rWgR7Fl8GcPnEj20Z7OjezCFgQAkMLjpg8tAXvfKCQrGzi0gXrauWmluo40PCWkH1J5rPglo79Xnko+J5A7KV5Oo0jjIY/bQjt55mtUCQlrAlxGU6NJ7DBPthUsFMdtglUQt3Vz6yEdLPFNKcySsc22i+9fJs0qRmBpl4VuJiNpqGGeD/zcK+8+Um5HuOTPI2Ki56TAv/LH+ls50dpWnfc8Zw3F4QPIuEAXqZfNk7rmq4PrMIur043Ir5trKboFEGvKcwdFF1eHqaUg5WVSQcIhA3W70T+3FtbgFcVbgeLCSrL7H0+Kwzh1IBmPYfEOShVL5mIHGHnvK2YtQKl4ziiwHP78crmzxuw9AdOg4t/MdinVI5GoCkGYt/oG9o76y622ZHeg7/Q7eIo8liS9uivkHeMY2PibLy06V8LivpUVXHdk9OVmCGYXJzhdNYS+p+2kbImYKx3TJUwlRvwUjhO52v5tonsWxLjLoaKP8YukqesVKECkYMA3soKUAsnd45gmLl1GG+i5VVUlJ9M9bUqkvGjXeaR7xLUMv+9d/7SzT56o5gTP6pdwXqJ/iOUHXdXyGx7V7phMZU= 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" 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