107664ca6SAlistair Francis /* 207664ca6SAlistair Francis * QEMU model of the Xilinx ZynqMP Real Time Clock (RTC). 307664ca6SAlistair Francis * 407664ca6SAlistair Francis * Copyright (c) 2017 Xilinx Inc. 507664ca6SAlistair Francis * 68035f85eSPhilippe Mathieu-Daudé * Written-by: Alistair Francis 707664ca6SAlistair Francis * 807664ca6SAlistair Francis * Permission is hereby granted, free of charge, to any person obtaining a copy 907664ca6SAlistair Francis * of this software and associated documentation files (the "Software"), to deal 1007664ca6SAlistair Francis * in the Software without restriction, including without limitation the rights 1107664ca6SAlistair Francis * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1207664ca6SAlistair Francis * copies of the Software, and to permit persons to whom the Software is 1307664ca6SAlistair Francis * furnished to do so, subject to the following conditions: 1407664ca6SAlistair Francis * 1507664ca6SAlistair Francis * The above copyright notice and this permission notice shall be included in 1607664ca6SAlistair Francis * all copies or substantial portions of the Software. 1707664ca6SAlistair Francis * 1807664ca6SAlistair Francis * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1907664ca6SAlistair Francis * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 2007664ca6SAlistair Francis * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2107664ca6SAlistair Francis * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 2207664ca6SAlistair Francis * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 2307664ca6SAlistair Francis * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 2407664ca6SAlistair Francis * THE SOFTWARE. 2507664ca6SAlistair Francis */ 2607664ca6SAlistair Francis 27*52581c71SMarkus Armbruster #ifndef HW_RTC_XLNX_ZYNQMP_RTC_H 28*52581c71SMarkus Armbruster #define HW_RTC_XLNX_ZYNQMP_RTC_H 29f91005e1SMarkus Armbruster 3007664ca6SAlistair Francis #include "hw/register.h" 31ec150c7eSMarkus Armbruster #include "hw/sysbus.h" 32db1015e9SEduardo Habkost #include "qom/object.h" 3307664ca6SAlistair Francis 3407664ca6SAlistair Francis #define TYPE_XLNX_ZYNQMP_RTC "xlnx-zynmp.rtc" 3507664ca6SAlistair Francis 368063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPRTC, XLNX_ZYNQMP_RTC) 3707664ca6SAlistair Francis 3807664ca6SAlistair Francis REG32(SET_TIME_WRITE, 0x0) 3907664ca6SAlistair Francis REG32(SET_TIME_READ, 0x4) 4007664ca6SAlistair Francis REG32(CALIB_WRITE, 0x8) 4107664ca6SAlistair Francis FIELD(CALIB_WRITE, FRACTION_EN, 20, 1) 4207664ca6SAlistair Francis FIELD(CALIB_WRITE, FRACTION_DATA, 16, 4) 4307664ca6SAlistair Francis FIELD(CALIB_WRITE, MAX_TICK, 0, 16) 4407664ca6SAlistair Francis REG32(CALIB_READ, 0xc) 4507664ca6SAlistair Francis FIELD(CALIB_READ, FRACTION_EN, 20, 1) 4607664ca6SAlistair Francis FIELD(CALIB_READ, FRACTION_DATA, 16, 4) 4707664ca6SAlistair Francis FIELD(CALIB_READ, MAX_TICK, 0, 16) 4807664ca6SAlistair Francis REG32(CURRENT_TIME, 0x10) 4907664ca6SAlistair Francis REG32(CURRENT_TICK, 0x14) 5007664ca6SAlistair Francis FIELD(CURRENT_TICK, VALUE, 0, 16) 5107664ca6SAlistair Francis REG32(ALARM, 0x18) 5207664ca6SAlistair Francis REG32(RTC_INT_STATUS, 0x20) 5307664ca6SAlistair Francis FIELD(RTC_INT_STATUS, ALARM, 1, 1) 5407664ca6SAlistair Francis FIELD(RTC_INT_STATUS, SECONDS, 0, 1) 5507664ca6SAlistair Francis REG32(RTC_INT_MASK, 0x24) 5607664ca6SAlistair Francis FIELD(RTC_INT_MASK, ALARM, 1, 1) 5707664ca6SAlistair Francis FIELD(RTC_INT_MASK, SECONDS, 0, 1) 5807664ca6SAlistair Francis REG32(RTC_INT_EN, 0x28) 5907664ca6SAlistair Francis FIELD(RTC_INT_EN, ALARM, 1, 1) 6007664ca6SAlistair Francis FIELD(RTC_INT_EN, SECONDS, 0, 1) 6107664ca6SAlistair Francis REG32(RTC_INT_DIS, 0x2c) 6207664ca6SAlistair Francis FIELD(RTC_INT_DIS, ALARM, 1, 1) 6307664ca6SAlistair Francis FIELD(RTC_INT_DIS, SECONDS, 0, 1) 6407664ca6SAlistair Francis REG32(ADDR_ERROR, 0x30) 6507664ca6SAlistair Francis FIELD(ADDR_ERROR, STATUS, 0, 1) 6607664ca6SAlistair Francis REG32(ADDR_ERROR_INT_MASK, 0x34) 6707664ca6SAlistair Francis FIELD(ADDR_ERROR_INT_MASK, MASK, 0, 1) 6807664ca6SAlistair Francis REG32(ADDR_ERROR_INT_EN, 0x38) 6907664ca6SAlistair Francis FIELD(ADDR_ERROR_INT_EN, MASK, 0, 1) 7007664ca6SAlistair Francis REG32(ADDR_ERROR_INT_DIS, 0x3c) 7107664ca6SAlistair Francis FIELD(ADDR_ERROR_INT_DIS, MASK, 0, 1) 7207664ca6SAlistair Francis REG32(CONTROL, 0x40) 7307664ca6SAlistair Francis FIELD(CONTROL, BATTERY_DISABLE, 31, 1) 7407664ca6SAlistair Francis FIELD(CONTROL, OSC_CNTRL, 24, 4) 7507664ca6SAlistair Francis FIELD(CONTROL, SLVERR_ENABLE, 0, 1) 7607664ca6SAlistair Francis REG32(SAFETY_CHK, 0x50) 7707664ca6SAlistair Francis 7807664ca6SAlistair Francis #define XLNX_ZYNQMP_RTC_R_MAX (R_SAFETY_CHK + 1) 7907664ca6SAlistair Francis 80db1015e9SEduardo Habkost struct XlnxZynqMPRTC { 8107664ca6SAlistair Francis SysBusDevice parent_obj; 8207664ca6SAlistair Francis MemoryRegion iomem; 8307664ca6SAlistair Francis qemu_irq irq_rtc_int; 8407664ca6SAlistair Francis qemu_irq irq_addr_error_int; 8507664ca6SAlistair Francis 86246003ceSAlistair Francis uint32_t tick_offset; 87246003ceSAlistair Francis 8807664ca6SAlistair Francis uint32_t regs[XLNX_ZYNQMP_RTC_R_MAX]; 8907664ca6SAlistair Francis RegisterInfo regs_info[XLNX_ZYNQMP_RTC_R_MAX]; 90db1015e9SEduardo Habkost }; 91f91005e1SMarkus Armbruster 92f91005e1SMarkus Armbruster #endif 93