qemu/hw/misc/xlnx-versal-cpm5-slcr-secure.c
<<
>>
Prefs
   1/*
   2 * QEMU model of the CPM5_SLCR_SECURE This block holds the TrustZone configuration of varlious master and slave devices in CPM5
   3 *
   4 * Copyright (c) 2022 Xilinx Inc.
   5 *
   6 * Autogenerated by xregqemu.py 2022-05-02.
   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#include "migration/vmstate.h"
  33#include "hw/irq.h"
  34
  35#ifndef XILINX_CPM5_SLCR_SECURE_ERR_DEBUG
  36#define XILINX_CPM5_SLCR_SECURE_ERR_DEBUG 0
  37#endif
  38
  39#define TYPE_XILINX_CPM5_SLCR_SECURE "xlnx.cpm5_slcr_secure"
  40
  41#define XILINX_CPM5_SLCR_SECURE(obj) \
  42     OBJECT_CHECK(CPM5_SLCR_SECURE, (obj), TYPE_XILINX_CPM5_SLCR_SECURE)
  43
  44REG32(WPROTS, 0x0)
  45    FIELD(WPROTS, ACTIVE, 0, 1)
  46REG32(WPROTP, 0x4)
  47    FIELD(WPROTP, ACTIVE, 0, 1)
  48REG32(TZPROT, 0x8)
  49    FIELD(TZPROT, ACTIVE, 0, 1)
  50REG32(REG_CTRL, 0xc)
  51    FIELD(REG_CTRL, SLVERR_ENABLE, 0, 1)
  52REG32(IR_STATUS, 0x10)
  53    FIELD(IR_STATUS, ADDR_DECODE_ERR, 0, 1)
  54REG32(IR_MASK, 0x14)
  55    FIELD(IR_MASK, ADDR_DECODE_ERR, 0, 1)
  56REG32(IR_ENABLE, 0x18)
  57    FIELD(IR_ENABLE, ADDR_DECODE_ERR, 0, 1)
  58REG32(IR_DISABLE, 0x1c)
  59    FIELD(IR_DISABLE, ADDR_DECODE_ERR, 0, 1)
  60REG32(TZ_PCIE0, 0x100)
  61    FIELD(TZ_PCIE0, ATTRIB_PCIE, 1, 1)
  62    FIELD(TZ_PCIE0, CFG_MGMT_PCIE, 0, 1)
  63REG32(TZ_PCIE1, 0x104)
  64    FIELD(TZ_PCIE1, ATTRIB_PCIE, 1, 1)
  65    FIELD(TZ_PCIE1, CFG_MGMT_PCIE, 0, 1)
  66REG32(TZ_DMA0_0, 0x108)
  67    FIELD(TZ_DMA0_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_5, 11, 1)
  68    FIELD(TZ_DMA0_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_4, 10, 1)
  69    FIELD(TZ_DMA0_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_3, 9, 1)
  70    FIELD(TZ_DMA0_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_2, 8, 1)
  71    FIELD(TZ_DMA0_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_1, 7, 1)
  72    FIELD(TZ_DMA0_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_0, 6, 1)
  73    FIELD(TZ_DMA0_0, ATTR_DMA_CH3_SEC, 5, 1)
  74    FIELD(TZ_DMA0_0, ATTR_DMA_CH2_SEC, 4, 1)
  75    FIELD(TZ_DMA0_0, ATTR_DMA_CH1_SEC, 3, 1)
  76    FIELD(TZ_DMA0_0, ATTR_DMA_CH0_SEC, 2, 1)
  77    FIELD(TZ_DMA0_0, ATTR_DMA_ENABLE_SECURE, 1, 1)
  78    FIELD(TZ_DMA0_0, ATTRIB_DMA, 0, 1)
  79REG32(TZ_DMA0_1, 0x10c)
  80    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF15, 31, 1)
  81    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF14, 30, 1)
  82    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF13, 29, 1)
  83    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF12, 28, 1)
  84    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF11, 27, 1)
  85    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF10, 26, 1)
  86    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF9, 25, 1)
  87    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF8, 24, 1)
  88    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF7, 23, 1)
  89    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF6, 22, 1)
  90    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF5, 21, 1)
  91    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF4, 20, 1)
  92    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF3, 19, 1)
  93    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF2, 18, 1)
  94    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF1, 17, 1)
  95    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF0, 16, 1)
  96    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF15, 15, 1)
  97    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF14, 14, 1)
  98    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF13, 13, 1)
  99    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF12, 12, 1)
 100    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF11, 11, 1)
 101    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF10, 10, 1)
 102    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF9, 9, 1)
 103    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF8, 8, 1)
 104    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF7, 7, 1)
 105    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF6, 6, 1)
 106    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF5, 5, 1)
 107    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF4, 4, 1)
 108    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF3, 3, 1)
 109    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF2, 2, 1)
 110    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF1, 1, 1)
 111    FIELD(TZ_DMA0_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF0, 0, 1)
 112REG32(TZ_DMA0_2, 0x110)
 113    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF15, 31, 1)
 114    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF14, 30, 1)
 115    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF13, 29, 1)
 116    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF12, 28, 1)
 117    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF11, 27, 1)
 118    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF10, 26, 1)
 119    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF9, 25, 1)
 120    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF8, 24, 1)
 121    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF7, 23, 1)
 122    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF6, 22, 1)
 123    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF5, 21, 1)
 124    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF4, 20, 1)
 125    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF3, 19, 1)
 126    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF2, 18, 1)
 127    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF1, 17, 1)
 128    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_VF_PF0, 16, 1)
 129    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF15, 15, 1)
 130    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF14, 14, 1)
 131    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF13, 13, 1)
 132    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF12, 12, 1)
 133    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF11, 11, 1)
 134    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF10, 10, 1)
 135    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF9, 9, 1)
 136    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF8, 8, 1)
 137    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF7, 7, 1)
 138    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF6, 6, 1)
 139    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF5, 5, 1)
 140    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF4, 4, 1)
 141    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF3, 3, 1)
 142    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF2, 2, 1)
 143    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF1, 1, 1)
 144    FIELD(TZ_DMA0_2, ATTR_DMA_SEC_PF0, 0, 1)
 145REG32(TZ_DMA1_0, 0x114)
 146    FIELD(TZ_DMA1_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_5, 11, 1)
 147    FIELD(TZ_DMA1_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_4, 10, 1)
 148    FIELD(TZ_DMA1_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_3, 9, 1)
 149    FIELD(TZ_DMA1_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_2, 8, 1)
 150    FIELD(TZ_DMA1_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_1, 7, 1)
 151    FIELD(TZ_DMA1_0, ATTR_DMA_AXIBAR2PCIEBAR_SEC_0, 6, 1)
 152    FIELD(TZ_DMA1_0, ATTR_DMA_CH3_SEC, 5, 1)
 153    FIELD(TZ_DMA1_0, ATTR_DMA_CH2_SEC, 4, 1)
 154    FIELD(TZ_DMA1_0, ATTR_DMA_CH1_SEC, 3, 1)
 155    FIELD(TZ_DMA1_0, ATTR_DMA_CH0_SEC, 2, 1)
 156    FIELD(TZ_DMA1_0, ATTR_DMA_ENABLE_SECURE, 1, 1)
 157    FIELD(TZ_DMA1_0, ATTRIB_DMA, 0, 1)
 158REG32(TZ_DMA1_1, 0x118)
 159    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF15, 31, 1)
 160    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF14, 30, 1)
 161    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF13, 29, 1)
 162    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF12, 28, 1)
 163    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF11, 27, 1)
 164    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF10, 26, 1)
 165    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF9, 25, 1)
 166    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF8, 24, 1)
 167    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF7, 23, 1)
 168    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF6, 22, 1)
 169    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF5, 21, 1)
 170    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF4, 20, 1)
 171    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF3, 19, 1)
 172    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF2, 18, 1)
 173    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF1, 17, 1)
 174    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_VF_PF0, 16, 1)
 175    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF15, 15, 1)
 176    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF14, 14, 1)
 177    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF13, 13, 1)
 178    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF12, 12, 1)
 179    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF11, 11, 1)
 180    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF10, 10, 1)
 181    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF9, 9, 1)
 182    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF8, 8, 1)
 183    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF7, 7, 1)
 184    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF6, 6, 1)
 185    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF5, 5, 1)
 186    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF4, 4, 1)
 187    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF3, 3, 1)
 188    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF2, 2, 1)
 189    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF1, 1, 1)
 190    FIELD(TZ_DMA1_1, ATTR_DMA_PCIEBAR2AXIBAR_SEC_PF0, 0, 1)
 191REG32(TZ_DMA1_2, 0x11c)
 192    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF15, 31, 1)
 193    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF14, 30, 1)
 194    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF13, 29, 1)
 195    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF12, 28, 1)
 196    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF11, 27, 1)
 197    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF10, 26, 1)
 198    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF9, 25, 1)
 199    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF8, 24, 1)
 200    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF7, 23, 1)
 201    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF6, 22, 1)
 202    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF5, 21, 1)
 203    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF4, 20, 1)
 204    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF3, 19, 1)
 205    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF2, 18, 1)
 206    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF1, 17, 1)
 207    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_VF_PF0, 16, 1)
 208    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF15, 15, 1)
 209    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF14, 14, 1)
 210    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF13, 13, 1)
 211    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF12, 12, 1)
 212    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF11, 11, 1)
 213    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF10, 10, 1)
 214    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF9, 9, 1)
 215    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF8, 8, 1)
 216    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF7, 7, 1)
 217    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF6, 6, 1)
 218    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF5, 5, 1)
 219    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF4, 4, 1)
 220    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF3, 3, 1)
 221    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF2, 2, 1)
 222    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF1, 1, 1)
 223    FIELD(TZ_DMA1_2, ATTR_DMA_SEC_PF0, 0, 1)
 224REG32(TZ_CPI0, 0x120)
 225    FIELD(TZ_CPI0, PORT_CFG, 1, 1)
 226    FIELD(TZ_CPI0, PORT_EN, 0, 1)
 227REG32(TZ_CPI1, 0x124)
 228    FIELD(TZ_CPI1, PORT_CFG, 1, 1)
 229    FIELD(TZ_CPI1, PORT_EN, 0, 1)
 230REG32(TZ_CRX, 0x128)
 231    FIELD(TZ_CRX, CFG, 0, 1)
 232REG32(TZ_SLCR, 0x12c)
 233    FIELD(TZ_SLCR, CFG, 0, 1)
 234REG32(TZ_ADDRREMAP, 0x130)
 235    FIELD(TZ_ADDRREMAP, CFG, 0, 1)
 236REG32(TZ_MCAP0, 0x140)
 237    FIELD(TZ_MCAP0, OVERRIDE_VAL, 1, 1)
 238    FIELD(TZ_MCAP0, OVERRIDE_EN, 0, 1)
 239REG32(TZ_MCAP1, 0x144)
 240    FIELD(TZ_MCAP1, OVERRIDE_VAL, 1, 1)
 241    FIELD(TZ_MCAP1, OVERRIDE_EN, 0, 1)
 242REG32(PCIE0_SMID_EN, 0x200)
 243    FIELD(PCIE0_SMID_EN, SELECT_ENABLE, 10, 10)
 244    FIELD(PCIE0_SMID_EN, BASE, 0, 10)
 245REG32(PCIE0_SMID_CFG0, 0x204)
 246    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_7, 28, 4)
 247    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_6, 24, 4)
 248    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_5, 20, 4)
 249    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_4, 16, 4)
 250    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_3, 12, 4)
 251    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_2, 8, 4)
 252    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_1, 4, 4)
 253    FIELD(PCIE0_SMID_CFG0, BDF_BIT_SEL_0, 0, 4)
 254REG32(PCIE0_SMID_CFG1, 0x208)
 255    FIELD(PCIE0_SMID_CFG1, BDF_BIT_SEL_9, 4, 4)
 256    FIELD(PCIE0_SMID_CFG1, BDF_BIT_SEL_8, 0, 4)
 257REG32(PCIE1_SMID_EN, 0x20c)
 258    FIELD(PCIE1_SMID_EN, SELECT_ENABLE, 10, 10)
 259    FIELD(PCIE1_SMID_EN, BASE, 0, 10)
 260REG32(PCIE1_SMID_CFG0, 0x210)
 261    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_7, 28, 4)
 262    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_6, 24, 4)
 263    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_5, 20, 4)
 264    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_4, 16, 4)
 265    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_3, 12, 4)
 266    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_2, 8, 4)
 267    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_1, 4, 4)
 268    FIELD(PCIE1_SMID_CFG0, BDF_BIT_SEL_0, 0, 4)
 269REG32(PCIE1_SMID_CFG1, 0x214)
 270    FIELD(PCIE1_SMID_CFG1, BDF_BIT_SEL_9, 4, 4)
 271    FIELD(PCIE1_SMID_CFG1, BDF_BIT_SEL_8, 0, 4)
 272REG32(PCIE0_FUNC_NUM, 0x218)
 273    FIELD(PCIE0_FUNC_NUM, EN, 24, 1)
 274    FIELD(PCIE0_FUNC_NUM, DBG, 12, 12)
 275    FIELD(PCIE0_FUNC_NUM, PS, 0, 12)
 276REG32(PCIE1_FUNC_NUM, 0x21c)
 277    FIELD(PCIE1_FUNC_NUM, EN, 24, 1)
 278    FIELD(PCIE1_FUNC_NUM, DBG, 12, 12)
 279    FIELD(PCIE1_FUNC_NUM, PS, 0, 12)
 280REG32(CMN_SMID, 0x220)
 281    FIELD(CMN_SMID, BASE, 0, 10)
 282REG32(OD_MBIST_TRIGGER, 0x420)
 283    FIELD(OD_MBIST_TRIGGER, CPM5_INT_WRAP_BOT, 18, 1)
 284    FIELD(OD_MBIST_TRIGGER, CPM5_CMN_HNF_1, 17, 1)
 285    FIELD(OD_MBIST_TRIGGER, CPM5_CMN_HNF_0, 16, 1)
 286    FIELD(OD_MBIST_TRIGGER, CPM5_CMN_CXRH_1, 15, 1)
 287    FIELD(OD_MBIST_TRIGGER, CPM5_CMN_CXRH_0, 14, 1)
 288    FIELD(OD_MBIST_TRIGGER, CPM5_PCIE_PSB1_1, 13, 1)
 289    FIELD(OD_MBIST_TRIGGER, CPM5_PCIE_PSB1_0, 12, 1)
 290    FIELD(OD_MBIST_TRIGGER, CPM5_PCIE_1, 11, 1)
 291    FIELD(OD_MBIST_TRIGGER, CPM5_PCIE_PSB0_1, 10, 1)
 292    FIELD(OD_MBIST_TRIGGER, CPM5_PCIE_PSB0_0, 9, 1)
 293    FIELD(OD_MBIST_TRIGGER, CPM5_PCIE_0, 8, 1)
 294    FIELD(OD_MBIST_TRIGGER, CPM5_DMA1_2, 7, 1)
 295    FIELD(OD_MBIST_TRIGGER, CPM5_DMA1_1, 6, 1)
 296    FIELD(OD_MBIST_TRIGGER, CPM5_DMA1_0, 5, 1)
 297    FIELD(OD_MBIST_TRIGGER, CPM5_DMA0_2, 4, 1)
 298    FIELD(OD_MBIST_TRIGGER, CPM5_DMA0_1, 3, 1)
 299    FIELD(OD_MBIST_TRIGGER, CPM5_DMA0_0, 2, 1)
 300    FIELD(OD_MBIST_TRIGGER, CPM5_L2_1, 1, 1)
 301    FIELD(OD_MBIST_TRIGGER, CPM5_L2_0, 0, 1)
 302REG32(OD_MBIST_DONE, 0x42c)
 303    FIELD(OD_MBIST_DONE, CPM5_INT_WRAP_BOT, 18, 1)
 304    FIELD(OD_MBIST_DONE, CPM5_CMN_HNF_1, 17, 1)
 305    FIELD(OD_MBIST_DONE, CPM5_CMN_HNF_0, 16, 1)
 306    FIELD(OD_MBIST_DONE, CPM5_CMN_CXRH_1, 15, 1)
 307    FIELD(OD_MBIST_DONE, CPM5_CMN_CXRH_0, 14, 1)
 308    FIELD(OD_MBIST_DONE, CPM5_PCIE_PSB1_1, 13, 1)
 309    FIELD(OD_MBIST_DONE, CPM5_PCIE_PSB1_0, 12, 1)
 310    FIELD(OD_MBIST_DONE, CPM5_PCIE_1, 11, 1)
 311    FIELD(OD_MBIST_DONE, CPM5_PCIE_PSB0_1, 10, 1)
 312    FIELD(OD_MBIST_DONE, CPM5_PCIE_PSB0_0, 9, 1)
 313    FIELD(OD_MBIST_DONE, CPM5_PCIE_0, 8, 1)
 314    FIELD(OD_MBIST_DONE, CPM5_DMA1_2, 7, 1)
 315    FIELD(OD_MBIST_DONE, CPM5_DMA1_1, 6, 1)
 316    FIELD(OD_MBIST_DONE, CPM5_DMA1_0, 5, 1)
 317    FIELD(OD_MBIST_DONE, CPM5_DMA0_2, 4, 1)
 318    FIELD(OD_MBIST_DONE, CPM5_DMA0_1, 3, 1)
 319    FIELD(OD_MBIST_DONE, CPM5_DMA0_0, 2, 1)
 320    FIELD(OD_MBIST_DONE, CPM5_L2_1, 1, 1)
 321    FIELD(OD_MBIST_DONE, CPM5_L2_0, 0, 1)
 322REG32(OD_MBIST_PASSOUT, 0x430)
 323    FIELD(OD_MBIST_PASSOUT, CPM5_INT_WRAP_BOT, 18, 1)
 324    FIELD(OD_MBIST_PASSOUT, CPM5_CMN_HNF_1, 17, 1)
 325    FIELD(OD_MBIST_PASSOUT, CPM5_CMN_HNF_0, 16, 1)
 326    FIELD(OD_MBIST_PASSOUT, CPM5_CMN_CXRH_1, 15, 1)
 327    FIELD(OD_MBIST_PASSOUT, CPM5_CMN_CXRH_0, 14, 1)
 328    FIELD(OD_MBIST_PASSOUT, CPM5_PCIE_PSB1_1, 13, 1)
 329    FIELD(OD_MBIST_PASSOUT, CPM5_PCIE_PSB1_0, 12, 1)
 330    FIELD(OD_MBIST_PASSOUT, CPM5_PCIE_1, 11, 1)
 331    FIELD(OD_MBIST_PASSOUT, CPM5_PCIE_PSB0_1, 10, 1)
 332    FIELD(OD_MBIST_PASSOUT, CPM5_PCIE_PSB0_0, 9, 1)
 333    FIELD(OD_MBIST_PASSOUT, CPM5_PCIE_0, 8, 1)
 334    FIELD(OD_MBIST_PASSOUT, CPM5_DMA1_2, 7, 1)
 335    FIELD(OD_MBIST_PASSOUT, CPM5_DMA1_1, 6, 1)
 336    FIELD(OD_MBIST_PASSOUT, CPM5_DMA1_0, 5, 1)
 337    FIELD(OD_MBIST_PASSOUT, CPM5_DMA0_2, 4, 1)
 338    FIELD(OD_MBIST_PASSOUT, CPM5_DMA0_1, 3, 1)
 339    FIELD(OD_MBIST_PASSOUT, CPM5_DMA0_0, 2, 1)
 340    FIELD(OD_MBIST_PASSOUT, CPM5_L2_1, 1, 1)
 341    FIELD(OD_MBIST_PASSOUT, CPM5_L2_0, 0, 1)
 342
 343#define CPM5_SLCR_SECURE_R_MAX (R_OD_MBIST_PASSOUT + 1)
 344
 345typedef struct CPM5_SLCR_SECURE {
 346    SysBusDevice parent_obj;
 347    MemoryRegion iomem;
 348    qemu_irq irq_ir;
 349
 350    uint32_t regs[CPM5_SLCR_SECURE_R_MAX];
 351    RegisterInfo regs_info[CPM5_SLCR_SECURE_R_MAX];
 352} CPM5_SLCR_SECURE;
 353
 354static void ir_update_irq(CPM5_SLCR_SECURE *s)
 355{
 356    bool pending = s->regs[R_IR_STATUS] & ~s->regs[R_IR_MASK];
 357    qemu_set_irq(s->irq_ir, pending);
 358}
 359
 360static void ir_status_postw(RegisterInfo *reg, uint64_t val64)
 361{
 362    CPM5_SLCR_SECURE *s = XILINX_CPM5_SLCR_SECURE(reg->opaque);
 363    ir_update_irq(s);
 364}
 365
 366static uint64_t ir_enable_prew(RegisterInfo *reg, uint64_t val64)
 367{
 368    CPM5_SLCR_SECURE *s = XILINX_CPM5_SLCR_SECURE(reg->opaque);
 369    uint32_t val = val64;
 370
 371    s->regs[R_IR_MASK] &= ~val;
 372    ir_update_irq(s);
 373    return 0;
 374}
 375
 376static uint64_t ir_disable_prew(RegisterInfo *reg, uint64_t val64)
 377{
 378    CPM5_SLCR_SECURE *s = XILINX_CPM5_SLCR_SECURE(reg->opaque);
 379    uint32_t val = val64;
 380
 381    s->regs[R_IR_MASK] |= val;
 382    ir_update_irq(s);
 383    return 0;
 384}
 385
 386static void od_mbist_trigger_postw(RegisterInfo *reg, uint64_t val64)
 387{
 388    CPM5_SLCR_SECURE *s = XILINX_CPM5_SLCR_SECURE(reg->opaque);
 389    uint32_t val = val64;
 390
 391    s->regs[R_OD_MBIST_DONE] |= val;
 392    s->regs[R_OD_MBIST_PASSOUT] |= val;
 393}
 394
 395static const RegisterAccessInfo cpm5_slcr_secure_regs_info[] = {
 396    {   .name = "WPROTS",  .addr = A_WPROTS,
 397        .reset = 0x1,
 398    },{ .name = "WPROTP",  .addr = A_WPROTP,
 399        .reset = 0x1,
 400    },{ .name = "TZPROT",  .addr = A_TZPROT,
 401    },{ .name = "REG_CTRL",  .addr = A_REG_CTRL,
 402        .rsvd = 0xfffffffe,
 403        .ro = 0xfffffffe,
 404    },{ .name = "IR_STATUS",  .addr = A_IR_STATUS,
 405        .rsvd = 0xfffffffe,
 406        .ro = 0xfffffffe,
 407        .w1c = 0x1,
 408        .post_write = ir_status_postw,
 409    },{ .name = "IR_MASK",  .addr = A_IR_MASK,
 410        .reset = 0x1,
 411        .rsvd = 0xfffffffe,
 412        .ro = 0xffffffff,
 413    },{ .name = "IR_ENABLE",  .addr = A_IR_ENABLE,
 414        .rsvd = 0xfffffffe,
 415        .ro = 0xfffffffe,
 416        .pre_write = ir_enable_prew,
 417    },{ .name = "IR_DISABLE",  .addr = A_IR_DISABLE,
 418        .rsvd = 0xfffffffe,
 419        .ro = 0xfffffffe,
 420        .pre_write = ir_disable_prew,
 421    },{ .name = "TZ_PCIE0",  .addr = A_TZ_PCIE0,
 422        .reset = 0x3,
 423        .rsvd = 0xfffffffc,
 424        .ro = 0xfffffffc,
 425    },{ .name = "TZ_PCIE1",  .addr = A_TZ_PCIE1,
 426        .reset = 0x3,
 427        .rsvd = 0xfffffffc,
 428        .ro = 0xfffffffc,
 429    },{ .name = "TZ_DMA0_0",  .addr = A_TZ_DMA0_0,
 430        .reset = 0xfff,
 431        .rsvd = 0xfffff000,
 432        .ro = 0xfffff000,
 433    },{ .name = "TZ_DMA0_1",  .addr = A_TZ_DMA0_1,
 434        .reset = 0xffffffff,
 435    },{ .name = "TZ_DMA0_2",  .addr = A_TZ_DMA0_2,
 436        .reset = 0xffffffff,
 437    },{ .name = "TZ_DMA1_0",  .addr = A_TZ_DMA1_0,
 438        .reset = 0xfff,
 439        .rsvd = 0xfffff000,
 440        .ro = 0xfffff000,
 441    },{ .name = "TZ_DMA1_1",  .addr = A_TZ_DMA1_1,
 442        .reset = 0xffffffff,
 443    },{ .name = "TZ_DMA1_2",  .addr = A_TZ_DMA1_2,
 444        .reset = 0xffffffff,
 445    },{ .name = "TZ_CPI0",  .addr = A_TZ_CPI0,
 446        .reset = 0x3,
 447        .rsvd = 0xfffffffc,
 448        .ro = 0xfffffffc,
 449    },{ .name = "TZ_CPI1",  .addr = A_TZ_CPI1,
 450        .reset = 0x3,
 451        .rsvd = 0xfffffffc,
 452        .ro = 0xfffffffc,
 453    },{ .name = "TZ_CRX",  .addr = A_TZ_CRX,
 454        .reset = 0x1,
 455        .rsvd = 0xfffffffe,
 456        .ro = 0xfffffffe,
 457    },{ .name = "TZ_SLCR",  .addr = A_TZ_SLCR,
 458        .reset = 0x1,
 459        .rsvd = 0xfffffffe,
 460        .ro = 0xfffffffe,
 461    },{ .name = "TZ_ADDRREMAP",  .addr = A_TZ_ADDRREMAP,
 462        .reset = 0x1,
 463        .rsvd = 0xfffffffe,
 464        .ro = 0xfffffffe,
 465    },{ .name = "TZ_MCAP0",  .addr = A_TZ_MCAP0,
 466        .reset = 0x3,
 467        .rsvd = 0xfffffffc,
 468        .ro = 0xfffffffc,
 469    },{ .name = "TZ_MCAP1",  .addr = A_TZ_MCAP1,
 470        .reset = 0x3,
 471        .rsvd = 0xfffffffc,
 472        .ro = 0xfffffffc,
 473    },{ .name = "PCIE0_SMID_EN",  .addr = A_PCIE0_SMID_EN,
 474        .reset = 0xffc00,
 475        .rsvd = 0xfff00000,
 476        .ro = 0xfff00000,
 477    },{ .name = "PCIE0_SMID_CFG0",  .addr = A_PCIE0_SMID_CFG0,
 478        .reset = 0x76543210,
 479    },{ .name = "PCIE0_SMID_CFG1",  .addr = A_PCIE0_SMID_CFG1,
 480        .reset = 0x98,
 481        .rsvd = 0xffffff00,
 482        .ro = 0xffffff00,
 483    },{ .name = "PCIE1_SMID_EN",  .addr = A_PCIE1_SMID_EN,
 484        .reset = 0xffc00,
 485        .rsvd = 0xfff00000,
 486        .ro = 0xfff00000,
 487    },{ .name = "PCIE1_SMID_CFG0",  .addr = A_PCIE1_SMID_CFG0,
 488        .reset = 0x76543210,
 489    },{ .name = "PCIE1_SMID_CFG1",  .addr = A_PCIE1_SMID_CFG1,
 490        .reset = 0x98,
 491        .rsvd = 0xffffff00,
 492        .ro = 0xffffff00,
 493    },{ .name = "PCIE0_FUNC_NUM",  .addr = A_PCIE0_FUNC_NUM,
 494        .rsvd = 0xfe000000,
 495        .ro = 0xfe000000,
 496    },{ .name = "PCIE1_FUNC_NUM",  .addr = A_PCIE1_FUNC_NUM,
 497        .rsvd = 0xfe000000,
 498        .ro = 0xfe000000,
 499    },{ .name = "CMN_SMID",  .addr = A_CMN_SMID,
 500    },{ .name = "OD_MBIST_TRIGGER",  .addr = A_OD_MBIST_TRIGGER,
 501        .rsvd = 0xfff80000,
 502        .ro = 0xfff80000,
 503        .post_write = od_mbist_trigger_postw,
 504    },{ .name = "OD_MBIST_DONE",  .addr = A_OD_MBIST_DONE,
 505        .rsvd = 0xfff80000,
 506        .ro = 0xffffffff,
 507    },{ .name = "OD_MBIST_PASSOUT",  .addr = A_OD_MBIST_PASSOUT,
 508        .rsvd = 0xfff80000,
 509        .ro = 0xffffffff,
 510    }
 511};
 512
 513static void cpm5_slcr_secure_reset_enter(Object *obj, ResetType type)
 514{
 515    CPM5_SLCR_SECURE *s = XILINX_CPM5_SLCR_SECURE(obj);
 516    unsigned int i;
 517
 518    for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
 519        register_reset(&s->regs_info[i]);
 520    }
 521}
 522
 523static void cpm5_slcr_secure_reset_hold(Object *obj)
 524{
 525    CPM5_SLCR_SECURE *s = XILINX_CPM5_SLCR_SECURE(obj);
 526
 527    ir_update_irq(s);
 528}
 529
 530static const MemoryRegionOps cpm5_slcr_secure_ops = {
 531    .read = register_read_memory,
 532    .write = register_write_memory,
 533    .endianness = DEVICE_LITTLE_ENDIAN,
 534    .valid = {
 535        .min_access_size = 4,
 536        .max_access_size = 4,
 537    },
 538};
 539
 540static void cpm5_slcr_secure_realize(DeviceState *dev, Error **errp)
 541{
 542    /* Delete this if you don't need it */
 543}
 544
 545static void cpm5_slcr_secure_init(Object *obj)
 546{
 547    CPM5_SLCR_SECURE *s = XILINX_CPM5_SLCR_SECURE(obj);
 548    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 549    RegisterInfoArray *reg_array;
 550
 551    memory_region_init(&s->iomem, obj, TYPE_XILINX_CPM5_SLCR_SECURE, CPM5_SLCR_SECURE_R_MAX * 4);
 552    reg_array =
 553        register_init_block32(DEVICE(obj), cpm5_slcr_secure_regs_info,
 554                              ARRAY_SIZE(cpm5_slcr_secure_regs_info),
 555                              s->regs_info, s->regs,
 556                              &cpm5_slcr_secure_ops,
 557                              XILINX_CPM5_SLCR_SECURE_ERR_DEBUG,
 558                              CPM5_SLCR_SECURE_R_MAX * 4);
 559    memory_region_add_subregion(&s->iomem,
 560                                0x0,
 561                                &reg_array->mem);
 562    sysbus_init_mmio(sbd, &s->iomem);
 563    sysbus_init_irq(sbd, &s->irq_ir);
 564}
 565
 566static const VMStateDescription vmstate_cpm5_slcr_secure = {
 567    .name = TYPE_XILINX_CPM5_SLCR_SECURE,
 568    .version_id = 1,
 569    .minimum_version_id = 1,
 570    .fields = (VMStateField[]) {
 571        VMSTATE_UINT32_ARRAY(regs, CPM5_SLCR_SECURE, CPM5_SLCR_SECURE_R_MAX),
 572        VMSTATE_END_OF_LIST(),
 573    }
 574};
 575
 576static void cpm5_slcr_secure_class_init(ObjectClass *klass, void *data)
 577{
 578    ResettableClass *rc = RESETTABLE_CLASS(klass);
 579    DeviceClass *dc = DEVICE_CLASS(klass);
 580
 581    dc->realize = cpm5_slcr_secure_realize;
 582    dc->vmsd = &vmstate_cpm5_slcr_secure;
 583    rc->phases.enter = cpm5_slcr_secure_reset_enter;
 584    rc->phases.hold = cpm5_slcr_secure_reset_hold;
 585}
 586
 587static const TypeInfo cpm5_slcr_secure_info = {
 588    .name          = TYPE_XILINX_CPM5_SLCR_SECURE,
 589    .parent        = TYPE_SYS_BUS_DEVICE,
 590    .instance_size = sizeof(CPM5_SLCR_SECURE),
 591    .class_init    = cpm5_slcr_secure_class_init,
 592    .instance_init = cpm5_slcr_secure_init,
 593};
 594
 595static void cpm5_slcr_secure_register_types(void)
 596{
 597    type_register_static(&cpm5_slcr_secure_info);
 598}
 599
 600type_init(cpm5_slcr_secure_register_types)
 601