qemu/hw/misc/xilinx_zynqmp_sysmon.c
<<
>>
Prefs
   1/*
   2 * QEMU model of the SYSMON Registers for System 16nm Monitor
   3 *
   4 * Copyright (c) 2017 Xilinx Inc.
   5 *
   6 * Autogenerated by xregqemu.py 2017-02-15.
   7 *
   8 * Permission is hereby granted, free of charge, to any person obtaining a copy
   9 * of this software and associated documentation files (the "Software"), to deal
  10 * in the Software without restriction, including without limitation the rights
  11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  12 * copies of the Software, and to permit persons to whom the Software is
  13 * furnished to do so, subject to the following conditions:
  14 *
  15 * The above copyright notice and this permission notice shall be included in
  16 * all copies or substantial portions of the Software.
  17 *
  18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  24 * THE SOFTWARE.
  25 */
  26
  27#include "qemu/osdep.h"
  28#include "hw/sysbus.h"
  29#include "hw/register.h"
  30#include "qemu/bitops.h"
  31#include "qemu/log.h"
  32
  33#ifndef XILINX_SYSMON_ERR_DEBUG
  34#define XILINX_SYSMON_ERR_DEBUG 0
  35#endif
  36
  37#define TYPE_XILINX_SYSMON "xlnx,zynqmp_sysmon"
  38
  39#define XILINX_SYSMON(obj) \
  40     OBJECT_CHECK(SYSMON, (obj), TYPE_XILINX_SYSMON)
  41
  42REG32(TEMPERATURE, 0x0)
  43    FIELD(TEMPERATURE, TEMPERATURE, 16, 0)
  44REG32(SUPPLY1, 0x4)
  45    FIELD(SUPPLY1, SUPPLY_VAL, 16, 0)
  46REG32(SUPPLY2, 0x8)
  47    FIELD(SUPPLY2, SUPPLY_VAL, 16, 0)
  48REG32(SUPPLY3, 0x18)
  49    FIELD(SUPPLY3, SUPPLY_VAL, 16, 0)
  50REG32(SUPPLY4, 0x34)
  51    FIELD(SUPPLY4, SUPPLY_VAL, 16, 0)
  52REG32(SUPPLY5, 0x38)
  53    FIELD(SUPPLY5, SUPPLY_VAL, 16, 0)
  54REG32(SUPPLY6, 0x3c)
  55    FIELD(SUPPLY6, SUPPLY_VAL, 16, 0)
  56REG32(MAX_TEMPERATURE, 0x80)
  57    FIELD(MAX_TEMPERATURE, TEMPERATURE, 16, 0)
  58REG32(MAX_SUPPLY1, 0x84)
  59    FIELD(MAX_SUPPLY1, SUPPLY_VAL, 16, 0)
  60REG32(MAX_SUPPLY2, 0x88)
  61    FIELD(MAX_SUPPLY2, SUPPLY_VAL, 16, 0)
  62REG32(MAX_SUPPLY3, 0x8c)
  63    FIELD(MAX_SUPPLY3, SUPPLY_VAL, 16, 0)
  64REG32(MIN_TEMPERATURE, 0x90)
  65    FIELD(MIN_TEMPERATURE, TEMPERATURE, 16, 0)
  66REG32(MIN_SUPPLY1, 0x94)
  67    FIELD(MIN_SUPPLY1, SUPPLY_VAL, 16, 0)
  68REG32(MIN_SUPPLY2, 0x98)
  69    FIELD(MIN_SUPPLY2, SUPPLY_VAL, 16, 0)
  70REG32(MIN_SUPPLY3, 0x9c)
  71    FIELD(MIN_SUPPLY3, SUPPLY_VAL, 16, 0)
  72REG32(MAX_SUPPLY4, 0xa0)
  73    FIELD(MAX_SUPPLY4, SUPPLY_VAL, 16, 0)
  74REG32(MAX_SUPPLY5, 0xa4)
  75    FIELD(MAX_SUPPLY5, SUPPLY_VAL, 16, 0)
  76REG32(MAX_SUPPLY6, 0xa8)
  77    FIELD(MAX_SUPPLY6, SUPPLY_VAL, 16, 0)
  78REG32(MIN_SUPPLY4, 0xb0)
  79    FIELD(MIN_SUPPLY4, SUPPLY_VAL, 16, 0)
  80REG32(MIN_SUPPLY5, 0xb4)
  81    FIELD(MIN_SUPPLY5, SUPPLY_VAL, 16, 0)
  82REG32(MIN_SUPPLY6, 0xb8)
  83    FIELD(MIN_SUPPLY6, SUPPLY_VAL, 16, 0)
  84REG32(STATUS_FLAG, 0xfc)
  85    FIELD(STATUS_FLAG, CLK_OSC_USED, 1, 15)
  86    FIELD(STATUS_FLAG, BLOCK_IN_RESET, 1, 14)
  87    FIELD(STATUS_FLAG, JTAG_DISABLED, 1, 11)
  88    FIELD(STATUS_FLAG, JTAG_READ_ONLY, 1, 10)
  89    FIELD(STATUS_FLAG, INTERNAL_REF, 1, 9)
  90    FIELD(STATUS_FLAG, DISABLED, 1, 8)
  91    FIELD(STATUS_FLAG, ALM_6_3, 4, 4)
  92    FIELD(STATUS_FLAG, OT, 1, 3)
  93    FIELD(STATUS_FLAG, ALM_2_0, 3, 0)
  94REG32(CONFIG_REG0, 0x100)
  95    FIELD(CONFIG_REG0, AVERAGING, 2, 12)
  96    FIELD(CONFIG_REG0, EXTERNAL_MUX, 1, 11)
  97    FIELD(CONFIG_REG0, BU, 1, 10)
  98    FIELD(CONFIG_REG0, EC, 1, 9)
  99    FIELD(CONFIG_REG0, ACQ, 1, 8)
 100    FIELD(CONFIG_REG0, MUX_CHANNEL, 6, 0)
 101REG32(CONFIG_REG1, 0x104)
 102    FIELD(CONFIG_REG1, SEQUENCE_MODE, 4, 12)
 103    FIELD(CONFIG_REG1, ALARM_DISABLE6TO3, 4, 8)
 104    FIELD(CONFIG_REG1, ALARM_DISABLE2TO0, 3, 1)
 105    FIELD(CONFIG_REG1, OVER_TEMP_DISABLE, 1, 0)
 106REG32(CONFIG_REG2, 0x108)
 107    FIELD(CONFIG_REG2, CLOCK_DIVIDER, 8, 8)
 108    FIELD(CONFIG_REG2, POWER_DOWN, 4, 4)
 109    FIELD(CONFIG_REG2, TEST_CHANNEL_EN, 1, 2)
 110    FIELD(CONFIG_REG2, TEST_MODE, 2, 0)
 111REG32(CONFIG_REG3, 0x10c)
 112    FIELD(CONFIG_REG3, I2C_OVERRIDE_EN, 1, 15)
 113    FIELD(CONFIG_REG3, I2C_OVERRIDE_ADDR, 7, 8)
 114    FIELD(CONFIG_REG3, I2C_EN, 1, 7)
 115    FIELD(CONFIG_REG3, ALARM_DISABLE13TO8, 6, 0)
 116REG32(CONFIG_REG4, 0x110)
 117    FIELD(CONFIG_REG4, LOW_RATE_EOS, 2, 10)
 118    FIELD(CONFIG_REG4, SEQUENCE_RATE, 2, 8)
 119    FIELD(CONFIG_REG4, VUSER_ENABLE_HRANGE, 4, 0)
 120REG32(SEQ_CHANNEL2, 0x118)
 121    FIELD(SEQ_CHANNEL2, TEMPERATURE_REMOTE, 1, 5)
 122    FIELD(SEQ_CHANNEL2, VCCAMS, 1, 4)
 123    FIELD(SEQ_CHANNEL2, SUPPLY10, 1, 3)
 124    FIELD(SEQ_CHANNEL2, SUPPLY9, 1, 2)
 125    FIELD(SEQ_CHANNEL2, SUPPLY8, 1, 1)
 126    FIELD(SEQ_CHANNEL2, SUPPLY7, 1, 0)
 127REG32(SEQ_AVERAGE2, 0x11c)
 128    FIELD(SEQ_AVERAGE2, AVERAGE2, 16, 0)
 129REG32(SEQ_CHANNEL0, 0x120)
 130    FIELD(SEQ_CHANNEL0, CURRENT_MON, 1, 15)
 131    FIELD(SEQ_CHANNEL0, SUPPLY3, 1, 14)
 132    FIELD(SEQ_CHANNEL0, VREFN, 1, 13)
 133    FIELD(SEQ_CHANNEL0, VREFP, 1, 12)
 134    FIELD(SEQ_CHANNEL0, VP_VN, 1, 11)
 135    FIELD(SEQ_CHANNEL0, SUPPLY2, 1, 10)
 136    FIELD(SEQ_CHANNEL0, SUPPLY1, 1, 9)
 137    FIELD(SEQ_CHANNEL0, TEMPERATURE, 1, 8)
 138    FIELD(SEQ_CHANNEL0, SUPPLY6, 1, 7)
 139    FIELD(SEQ_CHANNEL0, SUPPLY5, 1, 6)
 140    FIELD(SEQ_CHANNEL0, SUPPLY4, 1, 5)
 141    FIELD(SEQ_CHANNEL0, TEST_CHANNEL, 1, 3)
 142    FIELD(SEQ_CHANNEL0, CALIBRATION, 1, 0)
 143REG32(SEQ_CHANNEL1, 0x124)
 144    FIELD(SEQ_CHANNEL1, VAUX0F, 1, 15)
 145    FIELD(SEQ_CHANNEL1, VAUX0E, 1, 14)
 146    FIELD(SEQ_CHANNEL1, VAUX0D, 1, 13)
 147    FIELD(SEQ_CHANNEL1, VAUX0C, 1, 12)
 148    FIELD(SEQ_CHANNEL1, VAUX0B, 1, 11)
 149    FIELD(SEQ_CHANNEL1, VAUX0A, 1, 10)
 150    FIELD(SEQ_CHANNEL1, VAUX09, 1, 9)
 151    FIELD(SEQ_CHANNEL1, VAUX08, 1, 8)
 152    FIELD(SEQ_CHANNEL1, VAUX07, 1, 7)
 153    FIELD(SEQ_CHANNEL1, VAUX06, 1, 6)
 154    FIELD(SEQ_CHANNEL1, VAUX05, 1, 5)
 155    FIELD(SEQ_CHANNEL1, VAUX04, 1, 4)
 156    FIELD(SEQ_CHANNEL1, VAUX03, 1, 3)
 157    FIELD(SEQ_CHANNEL1, VAUX02, 1, 2)
 158    FIELD(SEQ_CHANNEL1, VAUX01, 1, 1)
 159    FIELD(SEQ_CHANNEL1, VAUX00, 1, 0)
 160REG32(SEQ_AVERAGE0, 0x128)
 161    FIELD(SEQ_AVERAGE0, AVERAGE0, 16, 0)
 162REG32(SEQ_AVERAGE1, 0x12c)
 163    FIELD(SEQ_AVERAGE1, AVERAGE1, 16, 0)
 164REG32(SEQ_INPUT_MODE0, 0x130)
 165    FIELD(SEQ_INPUT_MODE0, INPUT_MODE0, 16, 0)
 166REG32(SEQ_INPUT_MODE1, 0x134)
 167    FIELD(SEQ_INPUT_MODE1, INPUT_MODE1, 16, 0)
 168REG32(SEQ_ACQ0, 0x138)
 169    FIELD(SEQ_ACQ0, ACQ0, 16, 0)
 170REG32(SEQ_ACQ1, 0x13c)
 171    FIELD(SEQ_ACQ1, ACQ1, 16, 0)
 172REG32(ALARM_TEMPERATURE_UPPER, 0x140)
 173    FIELD(ALARM_TEMPERATURE_UPPER, TEMPERATURE_ALARM, 16, 0)
 174REG32(ALARM_SUPPLY1_UPPER, 0x144)
 175    FIELD(ALARM_SUPPLY1_UPPER, SUPPLY_ALARM, 16, 0)
 176REG32(ALARM_SUPPLY2_UPPER, 0x148)
 177    FIELD(ALARM_SUPPLY2_UPPER, SUPPLY_ALARM, 16, 0)
 178REG32(ALARM_OT_UPPER, 0x14c)
 179    FIELD(ALARM_OT_UPPER, TEMPERATURE_ALARM, 16, 0)
 180REG32(ALARM_TEMPERATURE_LOWER, 0x150)
 181    FIELD(ALARM_TEMPERATURE_LOWER, TEMPERATURE_ALARM, 15, 1)
 182    FIELD(ALARM_TEMPERATURE_LOWER, THRESHOLD_MODE, 1, 0)
 183REG32(ALARM_SUPPLY1_LOWER, 0x154)
 184    FIELD(ALARM_SUPPLY1_LOWER, SUPPLY_ALARM, 16, 0)
 185REG32(ALARM_SUPPLY2_LOWER, 0x158)
 186    FIELD(ALARM_SUPPLY2_LOWER, SUPPLY_ALARM, 16, 0)
 187REG32(ALARM_OT_LOWER, 0x15c)
 188    FIELD(ALARM_OT_LOWER, TEMPERATURE_ALARM, 15, 1)
 189    FIELD(ALARM_OT_LOWER, THRESHOLD_MODE, 1, 0)
 190REG32(ALARM_SUPPLY3_UPPER, 0x160)
 191    FIELD(ALARM_SUPPLY3_UPPER, SUPPLY_ALARM, 16, 0)
 192REG32(ALARM_SUPPLY4_UPPER, 0x164)
 193    FIELD(ALARM_SUPPLY4_UPPER, SUPPLY_ALARM, 16, 0)
 194REG32(ALARM_SUPPLY5_UPPER, 0x168)
 195    FIELD(ALARM_SUPPLY5_UPPER, SUPPLY_ALARM, 16, 0)
 196REG32(ALARM_SUPPLY6_UPPER, 0x16c)
 197    FIELD(ALARM_SUPPLY6_UPPER, SUPPLY_ALARM, 16, 0)
 198REG32(ALARM_SUPPLY3_LOWER, 0x170)
 199    FIELD(ALARM_SUPPLY3_LOWER, SUPPLY_ALARM, 16, 0)
 200REG32(ALARM_SUPPLY4_LOWER, 0x174)
 201    FIELD(ALARM_SUPPLY4_LOWER, SUPPLY_ALARM, 16, 0)
 202REG32(ALARM_SUPPLY5_LOWER, 0x178)
 203    FIELD(ALARM_SUPPLY5_LOWER, SUPPLY_ALARM, 16, 0)
 204REG32(ALARM_SUPPLY6_LOWER, 0x17c)
 205    FIELD(ALARM_SUPPLY6_LOWER, SUPPLY_ALARM, 16, 0)
 206REG32(ALARM_SUPPLY7_UPPER, 0x180)
 207    FIELD(ALARM_SUPPLY7_UPPER, SUPPLY_ALARM, 16, 0)
 208REG32(ALARM_SUPPLY8_UPPER, 0x184)
 209    FIELD(ALARM_SUPPLY8_UPPER, SUPPLY_ALARM, 16, 0)
 210REG32(ALARM_SUPPLY9_UPPER, 0x188)
 211    FIELD(ALARM_SUPPLY9_UPPER, SUPPLY_ALARM, 16, 0)
 212REG32(ALARM_SUPPLY10_UPPER, 0x18c)
 213    FIELD(ALARM_SUPPLY10_UPPER, SUPPLY_ALARM, 16, 0)
 214REG32(ALARM_VCCAMS_UPPER, 0x190)
 215    FIELD(ALARM_VCCAMS_UPPER, SUPPLY_ALARM, 16, 0)
 216REG32(ALARM_TREMOTE_UPPER, 0x194)
 217    FIELD(ALARM_TREMOTE_UPPER, TEMPERATURE_ALARM, 16, 0)
 218REG32(ALARM_SUPPLY7_LOWER, 0x1a0)
 219    FIELD(ALARM_SUPPLY7_LOWER, SUPPLY_ALARM, 16, 0)
 220REG32(ALARM_SUPPLY8_LOWER, 0x1a4)
 221    FIELD(ALARM_SUPPLY8_LOWER, SUPPLY_ALARM, 16, 0)
 222REG32(ALARM_SUPPLY9_LOWER, 0x1a8)
 223    FIELD(ALARM_SUPPLY9_LOWER, SUPPLY_ALARM, 16, 0)
 224REG32(ALARM_SUPPLY10_LOWER, 0x1ac)
 225    FIELD(ALARM_SUPPLY10_LOWER, SUPPLY_ALARM, 16, 0)
 226REG32(ALARM_VCCAMS_LOWER, 0x1b0)
 227    FIELD(ALARM_VCCAMS_LOWER, SUPPLY_ALARM, 16, 0)
 228REG32(ALARM_TREMOTE_LOWER, 0x1b4)
 229    FIELD(ALARM_TREMOTE_LOWER, TEMPERATURE_ALARM, 15, 1)
 230    FIELD(ALARM_TREMOTE_LOWER, THRESHOLD_MODE, 1, 0)
 231REG32(SEQ_INPUT_MODE2, 0x1e0)
 232    FIELD(SEQ_INPUT_MODE2, INPUT_MODE2, 16, 0)
 233REG32(SEQ_ACQ2, 0x1e4)
 234    FIELD(SEQ_ACQ2, ACQ2, 16, 0)
 235REG32(SUPPLY7, 0x200)
 236    FIELD(SUPPLY7, SUPPLY_VAL, 16, 0)
 237REG32(SUPPLY8, 0x204)
 238    FIELD(SUPPLY8, SUPPLY_VAL, 16, 0)
 239REG32(SUPPLY9, 0x208)
 240    FIELD(SUPPLY9, SUPPLY_VAL, 16, 0)
 241REG32(SUPPLY10, 0x20c)
 242    FIELD(SUPPLY10, SUPPLY_VAL, 16, 0)
 243REG32(VCCAMS, 0x210)
 244    FIELD(VCCAMS, SUPPLY_VAL, 16, 0)
 245REG32(TEMPERATURE_REMOTE, 0x214)
 246    FIELD(TEMPERATURE_REMOTE, TEMPERATURE, 16, 0)
 247REG32(MAX_SUPPLY7, 0x280)
 248    FIELD(MAX_SUPPLY7, SUPPLY_VAL, 16, 0)
 249REG32(MAX_SUPPLY8, 0x284)
 250    FIELD(MAX_SUPPLY8, SUPPLY_VAL, 16, 0)
 251REG32(MAX_SUPPLY9, 0x288)
 252    FIELD(MAX_SUPPLY9, SUPPLY_VAL, 16, 0)
 253REG32(MAX_SUPPLY10, 0x28c)
 254    FIELD(MAX_SUPPLY10, SUPPLY_VAL, 16, 0)
 255REG32(MAX_VCCAMS, 0x290)
 256    FIELD(MAX_VCCAMS, SUPPLY_VAL, 16, 0)
 257REG32(MAX_TEMPERATURE_REMOTE, 0x294)
 258    FIELD(MAX_TEMPERATURE_REMOTE, TEMPERATURE, 16, 0)
 259REG32(MIN_SUPPLY7, 0x2a0)
 260    FIELD(MIN_SUPPLY7, SUPPLY_VAL, 16, 0)
 261REG32(MIN_SUPPLY8, 0x2a4)
 262    FIELD(MIN_SUPPLY8, SUPPLY_VAL, 16, 0)
 263REG32(MIN_SUPPLY9, 0x2a8)
 264    FIELD(MIN_SUPPLY9, SUPPLY_VAL, 16, 0)
 265REG32(MIN_SUPPLY10, 0x2ac)
 266    FIELD(MIN_SUPPLY10, SUPPLY_VAL, 16, 0)
 267REG32(MIN_VCCAMS, 0x2b0)
 268    FIELD(MIN_VCCAMS, SUPPLY_VAL, 16, 0)
 269REG32(MIN_TEMPERATURE_REMOTE, 0x2b4)
 270    FIELD(MIN_TEMPERATURE_REMOTE, TEMPERATURE, 16, 0)
 271
 272#define R_MAX (R_MIN_TEMPERATURE_REMOTE + 1)
 273
 274typedef struct SYSMON {
 275    SysBusDevice parent_obj;
 276    MemoryRegion iomem;
 277
 278    uint32_t regs[R_MAX];
 279    RegisterInfo regs_info[R_MAX];
 280} SYSMON;
 281
 282static RegisterAccessInfo sysmon_regs_info[] = {
 283    {   .name = "TEMPERATURE",  .decode.addr = A_TEMPERATURE,
 284        .ro = 0xffff,
 285    },{ .name = "SUPPLY1",  .decode.addr = A_SUPPLY1,
 286        .ro = 0xffff,
 287    },{ .name = "SUPPLY2",  .decode.addr = A_SUPPLY2,
 288        .ro = 0xffff,
 289    },{ .name = "SUPPLY3",  .decode.addr = A_SUPPLY3,
 290        .ro = 0xffff,
 291    },{ .name = "SUPPLY4",  .decode.addr = A_SUPPLY4,
 292        .ro = 0xffff,
 293    },{ .name = "SUPPLY5",  .decode.addr = A_SUPPLY5,
 294        .ro = 0xffff,
 295    },{ .name = "SUPPLY6",  .decode.addr = A_SUPPLY6,
 296        .ro = 0xffff,
 297    },{ .name = "MAX_TEMPERATURE",  .decode.addr = A_MAX_TEMPERATURE,
 298        .ro = 0xffff,
 299    },{ .name = "MAX_SUPPLY1",  .decode.addr = A_MAX_SUPPLY1,
 300        .ro = 0xffff,
 301    },{ .name = "MAX_SUPPLY2",  .decode.addr = A_MAX_SUPPLY2,
 302        .ro = 0xffff,
 303    },{ .name = "MAX_SUPPLY3",  .decode.addr = A_MAX_SUPPLY3,
 304        .ro = 0xffff,
 305    },{ .name = "MIN_TEMPERATURE",  .decode.addr = A_MIN_TEMPERATURE,
 306        .reset = 0xffff,
 307        .ro = 0xffff,
 308    },{ .name = "MIN_SUPPLY1",  .decode.addr = A_MIN_SUPPLY1,
 309        .reset = 0xffff,
 310        .ro = 0xffff,
 311    },{ .name = "MIN_SUPPLY2",  .decode.addr = A_MIN_SUPPLY2,
 312        .reset = 0xffff,
 313        .ro = 0xffff,
 314    },{ .name = "MIN_SUPPLY3",  .decode.addr = A_MIN_SUPPLY3,
 315        .reset = 0xffff,
 316        .ro = 0xffff,
 317    },{ .name = "MAX_SUPPLY4",  .decode.addr = A_MAX_SUPPLY4,
 318        .ro = 0xffff,
 319    },{ .name = "MAX_SUPPLY5",  .decode.addr = A_MAX_SUPPLY5,
 320        .ro = 0xffff,
 321    },{ .name = "MAX_SUPPLY6",  .decode.addr = A_MAX_SUPPLY6,
 322        .ro = 0xffff,
 323    },{ .name = "MIN_SUPPLY4",  .decode.addr = A_MIN_SUPPLY4,
 324        .reset = 0xffff,
 325        .ro = 0xffff,
 326    },{ .name = "MIN_SUPPLY5",  .decode.addr = A_MIN_SUPPLY5,
 327        .reset = 0xffff,
 328        .ro = 0xffff,
 329    },{ .name = "MIN_SUPPLY6",  .decode.addr = A_MIN_SUPPLY6,
 330        .reset = 0xffff,
 331        .ro = 0xffff,
 332    },{ .name = "STATUS_FLAG",  .decode.addr = A_STATUS_FLAG,
 333        .reset = 0xa00,
 334        .rsvd = 0x3000,
 335        .ro = 0xffff,
 336    },{ .name = "CONFIG_REG0",  .decode.addr = A_CONFIG_REG0,
 337        .rsvd = 0xc0c0,
 338    },{ .name = "CONFIG_REG1",  .decode.addr = A_CONFIG_REG1,
 339        .rsvd = 0xf0,
 340    },{ .name = "CONFIG_REG2",  .decode.addr = A_CONFIG_REG2,
 341        .rsvd = 0x8,
 342    },{ .name = "CONFIG_REG3",  .decode.addr = A_CONFIG_REG3,
 343        .rsvd = 0x40,
 344    },{ .name = "CONFIG_REG4",  .decode.addr = A_CONFIG_REG4,
 345        .rsvd = 0xf0f0,
 346    },{ .name = "SEQ_CHANNEL2",  .decode.addr = A_SEQ_CHANNEL2,
 347        .rsvd = 0xffc0,
 348    },{ .name = "SEQ_AVERAGE2",  .decode.addr = A_SEQ_AVERAGE2,
 349    },{ .name = "SEQ_CHANNEL0",  .decode.addr = A_SEQ_CHANNEL0,
 350        .rsvd = 0x16,
 351    },{ .name = "SEQ_CHANNEL1",  .decode.addr = A_SEQ_CHANNEL1,
 352    },{ .name = "SEQ_AVERAGE0",  .decode.addr = A_SEQ_AVERAGE0,
 353    },{ .name = "SEQ_AVERAGE1",  .decode.addr = A_SEQ_AVERAGE1,
 354    },{ .name = "SEQ_INPUT_MODE0",  .decode.addr = A_SEQ_INPUT_MODE0,
 355    },{ .name = "SEQ_INPUT_MODE1",  .decode.addr = A_SEQ_INPUT_MODE1,
 356    },{ .name = "SEQ_ACQ0",  .decode.addr = A_SEQ_ACQ0,
 357    },{ .name = "SEQ_ACQ1",  .decode.addr = A_SEQ_ACQ1,
 358    },{ .name = "ALARM_TEMPERATURE_UPPER",
 359        .decode.addr = A_ALARM_TEMPERATURE_UPPER,
 360    },{ .name = "ALARM_SUPPLY1_UPPER",  .decode.addr = A_ALARM_SUPPLY1_UPPER,
 361    },{ .name = "ALARM_SUPPLY2_UPPER",  .decode.addr = A_ALARM_SUPPLY2_UPPER,
 362    },{ .name = "ALARM_OT_UPPER",  .decode.addr = A_ALARM_OT_UPPER,
 363    },{ .name = "ALARM_TEMPERATURE_LOWER",
 364        .decode.addr = A_ALARM_TEMPERATURE_LOWER,
 365    },{ .name = "ALARM_SUPPLY1_LOWER",  .decode.addr = A_ALARM_SUPPLY1_LOWER,
 366    },{ .name = "ALARM_SUPPLY2_LOWER",  .decode.addr = A_ALARM_SUPPLY2_LOWER,
 367    },{ .name = "ALARM_OT_LOWER",  .decode.addr = A_ALARM_OT_LOWER,
 368    },{ .name = "ALARM_SUPPLY3_UPPER",  .decode.addr = A_ALARM_SUPPLY3_UPPER,
 369    },{ .name = "ALARM_SUPPLY4_UPPER",  .decode.addr = A_ALARM_SUPPLY4_UPPER,
 370    },{ .name = "ALARM_SUPPLY5_UPPER",  .decode.addr = A_ALARM_SUPPLY5_UPPER,
 371    },{ .name = "ALARM_SUPPLY6_UPPER",  .decode.addr = A_ALARM_SUPPLY6_UPPER,
 372    },{ .name = "ALARM_SUPPLY3_LOWER",  .decode.addr = A_ALARM_SUPPLY3_LOWER,
 373    },{ .name = "ALARM_SUPPLY4_LOWER",  .decode.addr = A_ALARM_SUPPLY4_LOWER,
 374    },{ .name = "ALARM_SUPPLY5_LOWER",  .decode.addr = A_ALARM_SUPPLY5_LOWER,
 375    },{ .name = "ALARM_SUPPLY6_LOWER",  .decode.addr = A_ALARM_SUPPLY6_LOWER,
 376    },{ .name = "ALARM_SUPPLY7_UPPER",  .decode.addr = A_ALARM_SUPPLY7_UPPER,
 377    },{ .name = "ALARM_SUPPLY8_UPPER",  .decode.addr = A_ALARM_SUPPLY8_UPPER,
 378    },{ .name = "ALARM_SUPPLY9_UPPER",  .decode.addr = A_ALARM_SUPPLY9_UPPER,
 379    },{ .name = "ALARM_SUPPLY10_UPPER",  .decode.addr = A_ALARM_SUPPLY10_UPPER,
 380    },{ .name = "ALARM_VCCAMS_UPPER",  .decode.addr = A_ALARM_VCCAMS_UPPER,
 381    },{ .name = "ALARM_TREMOTE_UPPER",  .decode.addr = A_ALARM_TREMOTE_UPPER,
 382    },{ .name = "ALARM_SUPPLY7_LOWER",  .decode.addr = A_ALARM_SUPPLY7_LOWER,
 383    },{ .name = "ALARM_SUPPLY8_LOWER",  .decode.addr = A_ALARM_SUPPLY8_LOWER,
 384    },{ .name = "ALARM_SUPPLY9_LOWER",  .decode.addr = A_ALARM_SUPPLY9_LOWER,
 385    },{ .name = "ALARM_SUPPLY10_LOWER",  .decode.addr = A_ALARM_SUPPLY10_LOWER,
 386    },{ .name = "ALARM_VCCAMS_LOWER",  .decode.addr = A_ALARM_VCCAMS_LOWER,
 387    },{ .name = "ALARM_TREMOTE_LOWER",  .decode.addr = A_ALARM_TREMOTE_LOWER,
 388    },{ .name = "SEQ_INPUT_MODE2",  .decode.addr = A_SEQ_INPUT_MODE2,
 389    },{ .name = "SEQ_ACQ2",  .decode.addr = A_SEQ_ACQ2,
 390    },{ .name = "SUPPLY7",  .decode.addr = A_SUPPLY7,
 391        .ro = 0xffff,
 392    },{ .name = "SUPPLY8",  .decode.addr = A_SUPPLY8,
 393        .ro = 0xffff,
 394    },{ .name = "SUPPLY9",  .decode.addr = A_SUPPLY9,
 395        .ro = 0xffff,
 396    },{ .name = "SUPPLY10",  .decode.addr = A_SUPPLY10,
 397        .ro = 0xffff,
 398    },{ .name = "VCCAMS",  .decode.addr = A_VCCAMS,
 399        .ro = 0xffff,
 400    },{ .name = "TEMPERATURE_REMOTE",  .decode.addr = A_TEMPERATURE_REMOTE,
 401        .ro = 0xffff,
 402    },{ .name = "MAX_SUPPLY7",  .decode.addr = A_MAX_SUPPLY7,
 403        .ro = 0xffff,
 404    },{ .name = "MAX_SUPPLY8",  .decode.addr = A_MAX_SUPPLY8,
 405        .ro = 0xffff,
 406    },{ .name = "MAX_SUPPLY9",  .decode.addr = A_MAX_SUPPLY9,
 407        .ro = 0xffff,
 408    },{ .name = "MAX_SUPPLY10",  .decode.addr = A_MAX_SUPPLY10,
 409        .ro = 0xffff,
 410    },{ .name = "MAX_VCCAMS",  .decode.addr = A_MAX_VCCAMS,
 411        .ro = 0xffff,
 412    },{ .name = "MAX_TEMPERATURE_REMOTE",
 413        .decode.addr = A_MAX_TEMPERATURE_REMOTE,
 414        .ro = 0xffff,
 415    },{ .name = "MIN_SUPPLY7",  .decode.addr = A_MIN_SUPPLY7,
 416        .reset = 0xffff,
 417        .ro = 0xffff,
 418    },{ .name = "MIN_SUPPLY8",  .decode.addr = A_MIN_SUPPLY8,
 419        .reset = 0xffff,
 420        .ro = 0xffff,
 421    },{ .name = "MIN_SUPPLY9",  .decode.addr = A_MIN_SUPPLY9,
 422        .reset = 0xffff,
 423        .ro = 0xffff,
 424    },{ .name = "MIN_SUPPLY10",  .decode.addr = A_MIN_SUPPLY10,
 425        .reset = 0xffff,
 426        .ro = 0xffff,
 427    },{ .name = "MIN_VCCAMS",  .decode.addr = A_MIN_VCCAMS,
 428        .reset = 0xffff,
 429        .ro = 0xffff,
 430    },{ .name = "MIN_TEMPERATURE_REMOTE",
 431        .decode.addr = A_MIN_TEMPERATURE_REMOTE,
 432        .reset = 0xffff,
 433        .ro = 0xffff,
 434    }
 435};
 436
 437static void sysmon_reset(DeviceState *dev)
 438{
 439    SYSMON *s = XILINX_SYSMON(dev);
 440    unsigned int i;
 441
 442    for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
 443        register_reset(&s->regs_info[i]);
 444    }
 445
 446}
 447
 448static uint64_t sysmon_read(void *opaque, hwaddr addr, unsigned size)
 449{
 450    SYSMON *s = XILINX_SYSMON(opaque);
 451    RegisterInfo *r = &s->regs_info[addr / 4];
 452
 453    if (!r->data) {
 454        qemu_log("%s: Decode error: read from %" HWADDR_PRIx "\n",
 455                 object_get_canonical_path(OBJECT(s)),
 456                 addr);
 457        return 0;
 458    }
 459    return register_read(r);
 460}
 461
 462static void sysmon_write(void *opaque, hwaddr addr, uint64_t value,
 463                      unsigned size)
 464{
 465    SYSMON *s = XILINX_SYSMON(opaque);
 466    RegisterInfo *r = &s->regs_info[addr / 4];
 467
 468    if (!r->data) {
 469        qemu_log("%s: Decode error: write to %" HWADDR_PRIx "=%" PRIx64 "\n",
 470                 object_get_canonical_path(OBJECT(s)),
 471                 addr, value);
 472        return;
 473    }
 474    register_write(r, value, ~0);
 475}
 476
 477static const MemoryRegionOps sysmon_ops = {
 478    .read = sysmon_read,
 479    .write = sysmon_write,
 480    .endianness = DEVICE_LITTLE_ENDIAN,
 481    .valid = {
 482        .min_access_size = 4,
 483        .max_access_size = 4,
 484    },
 485};
 486
 487static void sysmon_realize(DeviceState *dev, Error **errp)
 488{
 489    SYSMON *s = XILINX_SYSMON(dev);
 490    const char *prefix = object_get_canonical_path(OBJECT(dev));
 491    unsigned int i;
 492
 493    for (i = 0; i < ARRAY_SIZE(sysmon_regs_info); ++i) {
 494        RegisterInfo *r;
 495
 496        r = &s->regs_info[sysmon_regs_info[i].decode.addr / 4];
 497        *r = (RegisterInfo) {
 498            .data = (uint8_t *)&s->regs[
 499                    sysmon_regs_info[i].decode.addr / 4],
 500            .data_size = sizeof(uint32_t),
 501            .access = &sysmon_regs_info[i],
 502            .debug = XILINX_SYSMON_ERR_DEBUG,
 503            .prefix = prefix,
 504            .opaque = s,
 505        };
 506    }
 507}
 508
 509static void sysmon_init(Object *obj)
 510{
 511    SYSMON *s = XILINX_SYSMON(obj);
 512    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 513
 514    memory_region_init_io(&s->iomem, obj, &sysmon_ops, s,
 515                          TYPE_XILINX_SYSMON, R_MAX * 4);
 516    sysbus_init_mmio(sbd, &s->iomem);
 517}
 518
 519static const VMStateDescription vmstate_sysmon = {
 520    .name = TYPE_XILINX_SYSMON,
 521    .version_id = 1,
 522    .minimum_version_id = 1,
 523    .minimum_version_id_old = 1,
 524    .fields = (VMStateField[]) {
 525        VMSTATE_UINT32_ARRAY(regs, SYSMON, R_MAX),
 526        VMSTATE_END_OF_LIST(),
 527    }
 528};
 529
 530static void sysmon_class_init(ObjectClass *klass, void *data)
 531{
 532    DeviceClass *dc = DEVICE_CLASS(klass);
 533
 534    dc->reset = sysmon_reset;
 535    dc->realize = sysmon_realize;
 536    dc->vmsd = &vmstate_sysmon;
 537}
 538
 539static const TypeInfo sysmon_info = {
 540    .name          = TYPE_XILINX_SYSMON,
 541    .parent        = TYPE_SYS_BUS_DEVICE,
 542    .instance_size = sizeof(SYSMON),
 543    .class_init    = sysmon_class_init,
 544    .instance_init = sysmon_init,
 545};
 546
 547static void sysmon_register_types(void)
 548{
 549    type_register_static(&sysmon_info);
 550}
 551
 552type_init(sysmon_register_types)
 553