qemu/hw/misc/xlnx-versal-net-rpu-cluster.c
<<
>>
Prefs
   1/*
   2 * QEMU model of the PSX_RPU_CLUSTER Realtime Processing Unit
   3 *
   4 * Copyright (c) 2022 Xilinx Inc.
   5 *
   6 * Partially autogenerated by xregqemu.py 2022-03-22.
   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#include "hw/qdev-properties.h"
  35
  36#ifndef XILINX_PSX_RPU_CLUSTER_ERR_DEBUG
  37#define XILINX_PSX_RPU_CLUSTER_ERR_DEBUG 0
  38#endif
  39
  40#define TYPE_XILINX_PSX_RPU_CLUSTER "xlnx.psx_rpu_cluster_2.0"
  41
  42#define XILINX_PSX_RPU_CLUSTER(obj) \
  43     OBJECT_CHECK(PSX_RPU_CLUSTER, (obj), TYPE_XILINX_PSX_RPU_CLUSTER)
  44
  45REG32(CLUSTER_CFG, 0x0)
  46    FIELD(CLUSTER_CFG, RAMPROTEN, 12, 1)
  47    FIELD(CLUSTER_CFG, CLUSTERUTID_BIT1, 9, 1)
  48    FIELD(CLUSTER_CFG, CLUSTERUTID_BIT0, 8, 1)
  49    FIELD(CLUSTER_CFG, SLSPLIT, 0, 1)
  50REG32(CLUSTER_AXIS, 0x10)
  51    FIELD(CLUSTER_AXIS, TCM_BASE, 24, 8)
  52REG32(CLUSTER_PERIPH, 0x14)
  53    FIELD(CLUSTER_PERIPH, BASE, 21, 11)
  54REG32(CLUSTER_LLPP, 0x1c)
  55    FIELD(CLUSTER_LLPP, BASE, 12, 20)
  56    FIELD(CLUSTER_LLPP, SIZE, 0, 4)
  57REG32(CLUSTER_DCLSCOMPIN_LO, 0x30)
  58    FIELD(CLUSTER_DCLSCOMPIN_LO, COMPIN, 0, 28)
  59REG32(CLUSTER_DCLSCOMPIN_HI, 0x38)
  60    FIELD(CLUSTER_DCLSCOMPIN_HI, COMPIN, 4, 6)
  61REG32(CLUSTER_INTR_0, 0x40)
  62REG32(CLUSTER_INTR_1, 0x44)
  63REG32(CLUSTER_INTR_2, 0x48)
  64REG32(CLUSTER_INTR_3, 0x4c)
  65REG32(CLUSTER_INTR_4, 0x50)
  66REG32(CLUSTER_INTR_MASK_0, 0x54)
  67REG32(CLUSTER_INTR_MASK_1, 0x58)
  68REG32(CLUSTER_INTR_MASK_2, 0x5c)
  69REG32(CLUSTER_INTR_MASK_3, 0x60)
  70REG32(CLUSTER_INTR_MASK_4, 0x64)
  71REG32(CLUSTER_CCF_VAL, 0x68)
  72    FIELD(CLUSTER_CCF_VAL, TEST_MBIST_MODE, 7, 1)
  73    FIELD(CLUSTER_CCF_VAL, TEST_SCAN_MODE_LP, 6, 1)
  74    FIELD(CLUSTER_CCF_VAL, TEST_SCAN_MODE, 5, 1)
  75    FIELD(CLUSTER_CCF_VAL, ISO, 4, 1)
  76    FIELD(CLUSTER_CCF_VAL, PGE, 3, 1)
  77    FIELD(CLUSTER_CCF_VAL, R50_DBG_RST, 2, 1)
  78    FIELD(CLUSTER_CCF_VAL, R50_RST, 1, 1)
  79    FIELD(CLUSTER_CCF_VAL, PGE_RST, 0, 1)
  80REG32(CLUSTER_CCF_MASK, 0x6c)
  81    FIELD(CLUSTER_CCF_MASK, TEST_MBIST_MODE, 7, 1)
  82    FIELD(CLUSTER_CCF_MASK, TEST_SCAN_MODE_LP, 6, 1)
  83    FIELD(CLUSTER_CCF_MASK, TEST_SCAN_MODE, 5, 1)
  84    FIELD(CLUSTER_CCF_MASK, ISO, 4, 1)
  85    FIELD(CLUSTER_CCF_MASK, PGE, 3, 1)
  86    FIELD(CLUSTER_CCF_MASK, R50_DBG_RST, 2, 1)
  87    FIELD(CLUSTER_CCF_MASK, R50_RST, 1, 1)
  88    FIELD(CLUSTER_CCF_MASK, PGE_RST, 0, 1)
  89REG32(CLUSTER_SAFETY_CHK, 0x70)
  90REG32(CLUSTER_DCLSCOMPOUT_LO_STATUS, 0x80)
  91    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_27, 27, 1)
  92    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_26, 26, 1)
  93    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_25, 25, 1)
  94    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_24, 24, 1)
  95    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_23, 23, 1)
  96    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_22, 22, 1)
  97    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_21, 21, 1)
  98    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_20, 20, 1)
  99    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_19, 19, 1)
 100    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_18, 18, 1)
 101    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_17, 17, 1)
 102    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_16, 16, 1)
 103    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_15, 15, 1)
 104    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_14, 14, 1)
 105    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_13, 13, 1)
 106    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_12, 12, 1)
 107    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_11, 11, 1)
 108    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_10, 10, 1)
 109    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_9, 9, 1)
 110    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_8, 8, 1)
 111    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_7, 7, 1)
 112    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_6, 6, 1)
 113    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_5, 5, 1)
 114    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_4, 4, 1)
 115    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_3, 3, 1)
 116    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_2, 2, 1)
 117    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_1, 1, 1)
 118    FIELD(CLUSTER_DCLSCOMPOUT_LO_STATUS, VAL_0, 0, 1)
 119REG32(CLUSTER_DCLSCOMPOUT_LO_MASK, 0x84)
 120    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_27, 27, 1)
 121    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_26, 26, 1)
 122    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_25, 25, 1)
 123    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_24, 24, 1)
 124    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_23, 23, 1)
 125    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_22, 22, 1)
 126    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_21, 21, 1)
 127    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_20, 20, 1)
 128    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_19, 19, 1)
 129    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_18, 18, 1)
 130    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_17, 17, 1)
 131    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_16, 16, 1)
 132    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_15, 15, 1)
 133    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_14, 14, 1)
 134    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_13, 13, 1)
 135    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_12, 12, 1)
 136    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_11, 11, 1)
 137    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_10, 10, 1)
 138    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_9, 9, 1)
 139    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_8, 8, 1)
 140    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_7, 7, 1)
 141    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_6, 6, 1)
 142    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_5, 5, 1)
 143    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_4, 4, 1)
 144    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_3, 3, 1)
 145    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_2, 2, 1)
 146    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_1, 1, 1)
 147    FIELD(CLUSTER_DCLSCOMPOUT_LO_MASK, VAL_0, 0, 1)
 148REG32(CLUSTER_DCLSCOMPOUT_LO_EN, 0x88)
 149    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_27, 27, 1)
 150    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_26, 26, 1)
 151    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_25, 25, 1)
 152    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_24, 24, 1)
 153    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_23, 23, 1)
 154    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_22, 22, 1)
 155    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_21, 21, 1)
 156    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_20, 20, 1)
 157    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_19, 19, 1)
 158    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_18, 18, 1)
 159    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_17, 17, 1)
 160    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_16, 16, 1)
 161    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_15, 15, 1)
 162    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_14, 14, 1)
 163    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_13, 13, 1)
 164    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_12, 12, 1)
 165    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_11, 11, 1)
 166    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_10, 10, 1)
 167    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_9, 9, 1)
 168    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_8, 8, 1)
 169    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_7, 7, 1)
 170    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_6, 6, 1)
 171    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_5, 5, 1)
 172    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_4, 4, 1)
 173    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_3, 3, 1)
 174    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_2, 2, 1)
 175    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_1, 1, 1)
 176    FIELD(CLUSTER_DCLSCOMPOUT_LO_EN, VAL_0, 0, 1)
 177REG32(CLUSTER_DCLSCOMPOUT_LO_DIS, 0x8c)
 178    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_27, 27, 1)
 179    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_26, 26, 1)
 180    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_25, 25, 1)
 181    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_24, 24, 1)
 182    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_23, 23, 1)
 183    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_22, 22, 1)
 184    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_21, 21, 1)
 185    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_20, 20, 1)
 186    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_19, 19, 1)
 187    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_18, 18, 1)
 188    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_17, 17, 1)
 189    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_16, 16, 1)
 190    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_15, 15, 1)
 191    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_14, 14, 1)
 192    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_13, 13, 1)
 193    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_12, 12, 1)
 194    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_11, 11, 1)
 195    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_10, 10, 1)
 196    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_9, 9, 1)
 197    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_8, 8, 1)
 198    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_7, 7, 1)
 199    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_6, 6, 1)
 200    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_5, 5, 1)
 201    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_4, 4, 1)
 202    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_3, 3, 1)
 203    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_2, 2, 1)
 204    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_1, 1, 1)
 205    FIELD(CLUSTER_DCLSCOMPOUT_LO_DIS, VAL_0, 0, 1)
 206REG32(CLUSTER_DCLSCOMPOUT_LO_TRIGG, 0x90)
 207    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_27, 27, 1)
 208    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_26, 26, 1)
 209    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_25, 25, 1)
 210    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_24, 24, 1)
 211    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_23, 23, 1)
 212    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_22, 22, 1)
 213    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_21, 21, 1)
 214    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_20, 20, 1)
 215    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_19, 19, 1)
 216    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_18, 18, 1)
 217    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_17, 17, 1)
 218    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_16, 16, 1)
 219    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_15, 15, 1)
 220    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_14, 14, 1)
 221    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_13, 13, 1)
 222    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_12, 12, 1)
 223    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_11, 11, 1)
 224    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_10, 10, 1)
 225    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_9, 9, 1)
 226    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_8, 8, 1)
 227    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_7, 7, 1)
 228    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_6, 6, 1)
 229    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_5, 5, 1)
 230    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_4, 4, 1)
 231    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_3, 3, 1)
 232    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_2, 2, 1)
 233    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_1, 1, 1)
 234    FIELD(CLUSTER_DCLSCOMPOUT_LO_TRIGG, VAL_0, 0, 1)
 235REG32(CLUSTER_DCLSCOMPOUT_HI_STATUS, 0x94)
 236    FIELD(CLUSTER_DCLSCOMPOUT_HI_STATUS, VAL_89, 9, 1)
 237    FIELD(CLUSTER_DCLSCOMPOUT_HI_STATUS, VAL_88, 8, 1)
 238    FIELD(CLUSTER_DCLSCOMPOUT_HI_STATUS, VAL_87, 7, 1)
 239    FIELD(CLUSTER_DCLSCOMPOUT_HI_STATUS, VAL_86, 6, 1)
 240    FIELD(CLUSTER_DCLSCOMPOUT_HI_STATUS, VAL_85, 5, 1)
 241    FIELD(CLUSTER_DCLSCOMPOUT_HI_STATUS, VAL_84, 4, 1)
 242REG32(CLUSTER_DCLSCOMPOUT_HI_MASK, 0x98)
 243    FIELD(CLUSTER_DCLSCOMPOUT_HI_MASK, VAL_89, 9, 1)
 244    FIELD(CLUSTER_DCLSCOMPOUT_HI_MASK, VAL_88, 8, 1)
 245    FIELD(CLUSTER_DCLSCOMPOUT_HI_MASK, VAL_87, 7, 1)
 246    FIELD(CLUSTER_DCLSCOMPOUT_HI_MASK, VAL_86, 6, 1)
 247    FIELD(CLUSTER_DCLSCOMPOUT_HI_MASK, VAL_85, 5, 1)
 248    FIELD(CLUSTER_DCLSCOMPOUT_HI_MASK, VAL_84, 4, 1)
 249REG32(CLUSTER_DCLSCOMPOUT_HI_EN, 0x9c)
 250    FIELD(CLUSTER_DCLSCOMPOUT_HI_EN, VAL_89, 9, 1)
 251    FIELD(CLUSTER_DCLSCOMPOUT_HI_EN, VAL_88, 8, 1)
 252    FIELD(CLUSTER_DCLSCOMPOUT_HI_EN, VAL_87, 7, 1)
 253    FIELD(CLUSTER_DCLSCOMPOUT_HI_EN, VAL_86, 6, 1)
 254    FIELD(CLUSTER_DCLSCOMPOUT_HI_EN, VAL_85, 5, 1)
 255    FIELD(CLUSTER_DCLSCOMPOUT_HI_EN, VAL_84, 4, 1)
 256REG32(CLUSTER_DCLSCOMPOUT_HI_DIS, 0xa0)
 257    FIELD(CLUSTER_DCLSCOMPOUT_HI_DIS, VAL_89, 9, 1)
 258    FIELD(CLUSTER_DCLSCOMPOUT_HI_DIS, VAL_88, 8, 1)
 259    FIELD(CLUSTER_DCLSCOMPOUT_HI_DIS, VAL_87, 7, 1)
 260    FIELD(CLUSTER_DCLSCOMPOUT_HI_DIS, VAL_86, 6, 1)
 261    FIELD(CLUSTER_DCLSCOMPOUT_HI_DIS, VAL_85, 5, 1)
 262    FIELD(CLUSTER_DCLSCOMPOUT_HI_DIS, VAL_84, 4, 1)
 263REG32(CLUSTER_DCLSCOMPOUT_HI_TRIGG, 0xa4)
 264    FIELD(CLUSTER_DCLSCOMPOUT_HI_TRIGG, VAL_89, 9, 1)
 265    FIELD(CLUSTER_DCLSCOMPOUT_HI_TRIGG, VAL_88, 8, 1)
 266    FIELD(CLUSTER_DCLSCOMPOUT_HI_TRIGG, VAL_87, 7, 1)
 267    FIELD(CLUSTER_DCLSCOMPOUT_HI_TRIGG, VAL_86, 6, 1)
 268    FIELD(CLUSTER_DCLSCOMPOUT_HI_TRIGG, VAL_85, 5, 1)
 269    FIELD(CLUSTER_DCLSCOMPOUT_HI_TRIGG, VAL_84, 4, 1)
 270REG32(CLUSTER_MPID, 0xa8)
 271    FIELD(CLUSTER_MPID, AFF2_MSB, 17, 7)
 272    FIELD(CLUSTER_MPID, AFF2_BIT0, 16, 1)
 273    FIELD(CLUSTER_MPID, AFF1_MSB, 9, 7)
 274    FIELD(CLUSTER_MPID, AFF1_BIT0, 8, 1)
 275REG32(RPU_CLUSTER_ISR, 0xb0)
 276    FIELD(RPU_CLUSTER_ISR, CLUSTER_REG_PAR_MON_ERR1, 1, 1)
 277    FIELD(RPU_CLUSTER_ISR, CLUSTER_REG_PAR_MON_ERR0, 0, 1)
 278REG32(RPU_CLUSTER_IMR, 0xb4)
 279    FIELD(RPU_CLUSTER_IMR, CLUSTER_REG_PAR_MON_ERR1, 1, 1)
 280    FIELD(RPU_CLUSTER_IMR, CLUSTER_REG_PAR_MON_ERR0, 0, 1)
 281REG32(RPU_CLUSTER_IEN, 0xb8)
 282    FIELD(RPU_CLUSTER_IEN, CLUSTER_REG_PAR_MON_ERR1, 1, 1)
 283    FIELD(RPU_CLUSTER_IEN, CLUSTER_REG_PAR_MON_ERR0, 0, 1)
 284REG32(RPU_CLUSTER_IDS, 0xbc)
 285    FIELD(RPU_CLUSTER_IDS, CLUSTER_REG_PAR_MON_ERR1, 1, 1)
 286    FIELD(RPU_CLUSTER_IDS, CLUSTER_REG_PAR_MON_ERR0, 0, 1)
 287REG32(RPU_CLUSTER_PAR_MON, 0xc0)
 288    FIELD(RPU_CLUSTER_PAR_MON, CLUSTER_PAR_MON_EN, 0, 1)
 289REG32(CLUSTER_INTR_5, 0xc4)
 290REG32(CLUSTER_INTR_6, 0xc8)
 291REG32(CLUSTER_INTR_7, 0xcc)
 292REG32(CLUSTER_INTR_MASK_5, 0xd0)
 293REG32(CLUSTER_INTR_MASK_6, 0xd4)
 294REG32(CLUSTER_INTR_MASK_7, 0xd8)
 295
 296#define PSX_RPU_CLUSTER_R_MAX (R_CLUSTER_INTR_MASK_7 + 1)
 297
 298typedef struct PSX_RPU_CLUSTER {
 299    SysBusDevice parent_obj;
 300    MemoryRegion iomem;
 301    qemu_irq irq_cluster_dclscompout_hi;
 302    qemu_irq irq_cluster_dclscompout_lo;
 303    qemu_irq irq_rpu_cluster_imr;
 304    qemu_irq slsplit;
 305    uint32_t axis_base;
 306    MemoryRegion *tcm_mr;
 307
 308    uint32_t regs[PSX_RPU_CLUSTER_R_MAX];
 309    RegisterInfo regs_info[PSX_RPU_CLUSTER_R_MAX];
 310} PSX_RPU_CLUSTER;
 311
 312#define PROPAGATE_GPIO(reg, f, irq) { \
 313    bool val = ARRAY_FIELD_EX32(s->regs, reg, f); \
 314    qemu_set_irq(irq, val); \
 315}
 316
 317static void cluster_dclscompout_hi_update_irq(PSX_RPU_CLUSTER *s)
 318{
 319    bool pending = s->regs[R_CLUSTER_DCLSCOMPOUT_HI_STATUS] &
 320                   ~s->regs[R_CLUSTER_DCLSCOMPOUT_HI_MASK];
 321    qemu_set_irq(s->irq_cluster_dclscompout_hi, pending);
 322}
 323
 324static void cluster_dclscompout_hi_status_postw(RegisterInfo *reg,
 325                                                uint64_t val64)
 326{
 327    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 328    cluster_dclscompout_hi_update_irq(s);
 329}
 330
 331static uint64_t cluster_dclscompout_hi_en_prew(RegisterInfo *reg,
 332                                               uint64_t val64)
 333{
 334    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 335    uint32_t val = val64;
 336
 337    s->regs[R_CLUSTER_DCLSCOMPOUT_HI_MASK] &= ~val;
 338    cluster_dclscompout_hi_update_irq(s);
 339    return 0;
 340}
 341
 342static uint64_t cluster_dclscompout_hi_dis_prew(RegisterInfo *reg,
 343                                                uint64_t val64)
 344{
 345    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 346    uint32_t val = val64;
 347
 348    s->regs[R_CLUSTER_DCLSCOMPOUT_HI_MASK] |= val;
 349    cluster_dclscompout_hi_update_irq(s);
 350    return 0;
 351}
 352
 353static uint64_t cluster_dclscompout_hi_trigg_prew(RegisterInfo *reg,
 354                                                  uint64_t val64)
 355{
 356    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 357    uint32_t val = val64;
 358
 359    s->regs[R_CLUSTER_DCLSCOMPOUT_HI_STATUS] |= val;
 360    cluster_dclscompout_hi_update_irq(s);
 361    return 0;
 362}
 363
 364static void cluster_dclscompout_lo_update_irq(PSX_RPU_CLUSTER *s)
 365{
 366    bool pending = s->regs[R_CLUSTER_DCLSCOMPOUT_LO_STATUS] &
 367                   ~s->regs[R_CLUSTER_DCLSCOMPOUT_LO_MASK];
 368    qemu_set_irq(s->irq_cluster_dclscompout_lo, pending);
 369}
 370
 371static void cluster_dclscompout_lo_status_postw(RegisterInfo *reg,
 372                                                uint64_t val64)
 373{
 374    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 375    cluster_dclscompout_lo_update_irq(s);
 376}
 377
 378static uint64_t cluster_dclscompout_lo_en_prew(RegisterInfo *reg,
 379                                               uint64_t val64)
 380{
 381    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 382    uint32_t val = val64;
 383
 384    s->regs[R_CLUSTER_DCLSCOMPOUT_LO_MASK] &= ~val;
 385    cluster_dclscompout_lo_update_irq(s);
 386    return 0;
 387}
 388
 389static uint64_t cluster_dclscompout_lo_dis_prew(RegisterInfo *reg,
 390                                                uint64_t val64)
 391{
 392    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 393    uint32_t val = val64;
 394
 395    s->regs[R_CLUSTER_DCLSCOMPOUT_LO_MASK] |= val;
 396    cluster_dclscompout_lo_update_irq(s);
 397    return 0;
 398}
 399
 400static uint64_t cluster_dclscompout_lo_trigg_prew(RegisterInfo *reg,
 401                                                  uint64_t val64)
 402{
 403    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 404    uint32_t val = val64;
 405
 406    s->regs[R_CLUSTER_DCLSCOMPOUT_LO_STATUS] |= val;
 407    cluster_dclscompout_lo_update_irq(s);
 408    return 0;
 409}
 410
 411static void rpu_cluster_imr_update_irq(PSX_RPU_CLUSTER *s)
 412{
 413    bool pending = s->regs[R_RPU_CLUSTER_ISR] & ~s->regs[R_RPU_CLUSTER_IMR];
 414    qemu_set_irq(s->irq_rpu_cluster_imr, pending);
 415}
 416
 417static void rpu_cluster_isr_postw(RegisterInfo *reg, uint64_t val64)
 418{
 419    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 420    rpu_cluster_imr_update_irq(s);
 421}
 422
 423static uint64_t rpu_cluster_ien_prew(RegisterInfo *reg, uint64_t val64)
 424{
 425    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 426    uint32_t val = val64;
 427
 428    s->regs[R_RPU_CLUSTER_IMR] &= ~val;
 429    rpu_cluster_imr_update_irq(s);
 430    return 0;
 431}
 432
 433static uint64_t rpu_cluster_ids_prew(RegisterInfo *reg, uint64_t val64)
 434{
 435    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 436    uint32_t val = val64;
 437
 438    s->regs[R_RPU_CLUSTER_IMR] |= val;
 439    rpu_cluster_imr_update_irq(s);
 440    return 0;
 441}
 442
 443static void cluster_cfg_postw(RegisterInfo *reg, uint64_t val64)
 444{
 445    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 446
 447    PROPAGATE_GPIO(CLUSTER_CFG, SLSPLIT, s->slsplit);
 448}
 449
 450static void cluster_axis_postw(RegisterInfo *reg, uint64_t val64)
 451{
 452    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(reg->opaque);
 453    uint32_t val = val64;
 454    uint32_t addr;
 455    MemoryRegionSection section;
 456
 457    if (!s->tcm_mr) {
 458        return;
 459    }
 460
 461    section = memory_region_find(s->tcm_mr, 0, 0x400000);
 462    addr = section.offset_within_address_space;
 463    addr &= 0xFFFFFF;
 464    addr |= val & R_CLUSTER_AXIS_TCM_BASE_MASK;
 465    memory_region_set_address(s->tcm_mr, addr);
 466    memory_region_unref(section.mr);
 467}
 468
 469static const RegisterAccessInfo psx_rpu_cluster_regs_info[] = {
 470    {   .name = "CLUSTER_CFG",  .addr = A_CLUSTER_CFG,
 471        .rsvd = 0xffffecfe,
 472        .ro = 0x100,
 473        .post_write = cluster_cfg_postw,
 474    },{ .name = "CLUSTER_AXIS",  .addr = A_CLUSTER_AXIS,
 475        .rsvd = 0xffffff,
 476        .post_write = cluster_axis_postw,
 477    },{ .name = "CLUSTER_PERIPH",  .addr = A_CLUSTER_PERIPH,
 478        .reset = 0xe2000000,
 479        .rsvd = 0x1fffff,
 480    },{ .name = "CLUSTER_LLPP",  .addr = A_CLUSTER_LLPP,
 481        .reset = 0x8000000d,
 482        .rsvd = 0xff0,
 483    },{ .name = "CLUSTER_DCLSCOMPIN_LO",  .addr = A_CLUSTER_DCLSCOMPIN_LO,
 484        .rsvd = 0xf0000000,
 485    },{ .name = "CLUSTER_DCLSCOMPIN_HI",  .addr = A_CLUSTER_DCLSCOMPIN_HI,
 486        .rsvd = 0xfffffc0f,
 487    },{ .name = "CLUSTER_INTR_0",  .addr = A_CLUSTER_INTR_0,
 488    },{ .name = "CLUSTER_INTR_1",  .addr = A_CLUSTER_INTR_1,
 489    },{ .name = "CLUSTER_INTR_2",  .addr = A_CLUSTER_INTR_2,
 490    },{ .name = "CLUSTER_INTR_3",  .addr = A_CLUSTER_INTR_3,
 491    },{ .name = "CLUSTER_INTR_4",  .addr = A_CLUSTER_INTR_4,
 492    },{ .name = "CLUSTER_INTR_MASK_0",  .addr = A_CLUSTER_INTR_MASK_0,
 493    },{ .name = "CLUSTER_INTR_MASK_1",  .addr = A_CLUSTER_INTR_MASK_1,
 494    },{ .name = "CLUSTER_INTR_MASK_2",  .addr = A_CLUSTER_INTR_MASK_2,
 495    },{ .name = "CLUSTER_INTR_MASK_3",  .addr = A_CLUSTER_INTR_MASK_3,
 496    },{ .name = "CLUSTER_INTR_MASK_4",  .addr = A_CLUSTER_INTR_MASK_4,
 497    },{ .name = "CLUSTER_CCF_VAL",  .addr = A_CLUSTER_CCF_VAL,
 498        .reset = 0x7,
 499        .rsvd = 0xffffff00,
 500    },{ .name = "CLUSTER_CCF_MASK",  .addr = A_CLUSTER_CCF_MASK,
 501        .rsvd = 0xffffff00,
 502    },{ .name = "CLUSTER_SAFETY_CHK",  .addr = A_CLUSTER_SAFETY_CHK,
 503    },{ .name = "CLUSTER_DCLSCOMPOUT_LO_STATUS",
 504        .addr = A_CLUSTER_DCLSCOMPOUT_LO_STATUS,
 505        .rsvd = 0xf0000000,
 506        .w1c = 0xfffffff,
 507        .post_write = cluster_dclscompout_lo_status_postw,
 508    },{ .name = "CLUSTER_DCLSCOMPOUT_LO_MASK",
 509        .addr = A_CLUSTER_DCLSCOMPOUT_LO_MASK,
 510        .reset = 0xfffffff,
 511        .rsvd = 0xf0000000,
 512        .ro = 0xfffffff,
 513    },{ .name = "CLUSTER_DCLSCOMPOUT_LO_EN",
 514        .addr = A_CLUSTER_DCLSCOMPOUT_LO_EN,
 515        .rsvd = 0xf0000000,
 516        .pre_write = cluster_dclscompout_lo_en_prew,
 517    },{ .name = "CLUSTER_DCLSCOMPOUT_LO_DIS",
 518        .addr = A_CLUSTER_DCLSCOMPOUT_LO_DIS,
 519        .rsvd = 0xf0000000,
 520        .pre_write = cluster_dclscompout_lo_dis_prew,
 521    },{ .name = "CLUSTER_DCLSCOMPOUT_LO_TRIGG",
 522        .addr = A_CLUSTER_DCLSCOMPOUT_LO_TRIGG,
 523        .rsvd = 0xf0000000,
 524        .pre_write = cluster_dclscompout_lo_trigg_prew,
 525    },{ .name = "CLUSTER_DCLSCOMPOUT_HI_STATUS",
 526        .addr = A_CLUSTER_DCLSCOMPOUT_HI_STATUS,
 527        .rsvd = 0xfffffc0f,
 528        .w1c = 0x3f0,
 529        .post_write = cluster_dclscompout_hi_status_postw,
 530    },{ .name = "CLUSTER_DCLSCOMPOUT_HI_MASK",
 531        .addr = A_CLUSTER_DCLSCOMPOUT_HI_MASK,
 532        .reset = 0x3f0,
 533        .rsvd = 0xfffffc0f,
 534        .ro = 0x3f0,
 535    },{ .name = "CLUSTER_DCLSCOMPOUT_HI_EN",
 536        .addr = A_CLUSTER_DCLSCOMPOUT_HI_EN,
 537        .rsvd = 0xfffffc0f,
 538        .pre_write = cluster_dclscompout_hi_en_prew,
 539    },{ .name = "CLUSTER_DCLSCOMPOUT_HI_DIS",
 540        .addr = A_CLUSTER_DCLSCOMPOUT_HI_DIS,
 541        .rsvd = 0xfffffc0f,
 542        .pre_write = cluster_dclscompout_hi_dis_prew,
 543    },{ .name = "CLUSTER_DCLSCOMPOUT_HI_TRIGG",
 544        .addr = A_CLUSTER_DCLSCOMPOUT_HI_TRIGG,
 545        .rsvd = 0xfffffc0f,
 546        .pre_write = cluster_dclscompout_hi_trigg_prew,
 547    },{ .name = "CLUSTER_MPID",  .addr = A_CLUSTER_MPID,
 548        .rsvd = 0xff0000ff,
 549        .ro = 0x10100,
 550    },{ .name = "RPU_CLUSTER_ISR",  .addr = A_RPU_CLUSTER_ISR,
 551        .rsvd = 0xfffffffc,
 552        .w1c = 0x3,
 553        .post_write = rpu_cluster_isr_postw,
 554    },{ .name = "RPU_CLUSTER_IMR",  .addr = A_RPU_CLUSTER_IMR,
 555        .reset = 0x3,
 556        .rsvd = 0xfffffffc,
 557        .ro = 0x3,
 558    },{ .name = "RPU_CLUSTER_IEN",  .addr = A_RPU_CLUSTER_IEN,
 559        .rsvd = 0xfffffffc,
 560        .pre_write = rpu_cluster_ien_prew,
 561    },{ .name = "RPU_CLUSTER_IDS",  .addr = A_RPU_CLUSTER_IDS,
 562        .rsvd = 0xfffffffc,
 563        .pre_write = rpu_cluster_ids_prew,
 564    },{ .name = "RPU_CLUSTER_PAR_MON",  .addr = A_RPU_CLUSTER_PAR_MON,
 565        .rsvd = 0xfffffffe,
 566    },{ .name = "CLUSTER_INTR_5",  .addr = A_CLUSTER_INTR_5,
 567    },{ .name = "CLUSTER_INTR_6",  .addr = A_CLUSTER_INTR_6,
 568    },{ .name = "CLUSTER_INTR_7",  .addr = A_CLUSTER_INTR_7,
 569    },{ .name = "CLUSTER_INTR_MASK_5",  .addr = A_CLUSTER_INTR_MASK_5,
 570    },{ .name = "CLUSTER_INTR_MASK_6",  .addr = A_CLUSTER_INTR_MASK_6,
 571    },{ .name = "CLUSTER_INTR_MASK_7",  .addr = A_CLUSTER_INTR_MASK_7,
 572    }
 573};
 574
 575static void psx_rpu_cluster_reset_enter(Object *obj, ResetType type)
 576{
 577    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(obj);
 578    unsigned int i;
 579
 580    for (i = 0; i < ARRAY_SIZE(s->regs_info); ++i) {
 581        switch (i) {
 582        case R_CLUSTER_AXIS:
 583            continue;
 584        default:
 585            register_reset(&s->regs_info[i]);
 586        };
 587    }
 588    s->regs[R_CLUSTER_AXIS] = s->axis_base &
 589                              R_CLUSTER_AXIS_TCM_BASE_MASK;
 590}
 591
 592static void psx_rpu_cluster_reset_hold(Object *obj)
 593{
 594    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(obj);
 595
 596    cluster_dclscompout_hi_update_irq(s);
 597    cluster_dclscompout_lo_update_irq(s);
 598    rpu_cluster_imr_update_irq(s);
 599}
 600
 601static const MemoryRegionOps psx_rpu_cluster_ops = {
 602    .read = register_read_memory,
 603    .write = register_write_memory,
 604    .endianness = DEVICE_LITTLE_ENDIAN,
 605    .valid = {
 606        .min_access_size = 4,
 607        .max_access_size = 4,
 608    },
 609};
 610
 611static void psx_rpu_cluster_init(Object *obj)
 612{
 613    PSX_RPU_CLUSTER *s = XILINX_PSX_RPU_CLUSTER(obj);
 614    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
 615    RegisterInfoArray *reg_array;
 616
 617    memory_region_init(&s->iomem, obj, TYPE_XILINX_PSX_RPU_CLUSTER,
 618                       PSX_RPU_CLUSTER_R_MAX * 4);
 619    reg_array =
 620        register_init_block32(DEVICE(obj), psx_rpu_cluster_regs_info,
 621                              ARRAY_SIZE(psx_rpu_cluster_regs_info),
 622                              s->regs_info, s->regs,
 623                              &psx_rpu_cluster_ops,
 624                              XILINX_PSX_RPU_CLUSTER_ERR_DEBUG,
 625                              PSX_RPU_CLUSTER_R_MAX * 4);
 626    memory_region_add_subregion(&s->iomem,
 627                                0x0,
 628                                &reg_array->mem);
 629    sysbus_init_mmio(sbd, &s->iomem);
 630    sysbus_init_irq(sbd, &s->irq_cluster_dclscompout_hi);
 631    sysbus_init_irq(sbd, &s->irq_cluster_dclscompout_lo);
 632    sysbus_init_irq(sbd, &s->irq_rpu_cluster_imr);
 633    qdev_init_gpio_out(DEVICE(obj), &s->slsplit, 1);
 634    object_property_add_link(obj, "tcm-mr", TYPE_MEMORY_REGION,
 635                             (Object **)&s->tcm_mr,
 636                             qdev_prop_allow_set_link_before_realize,
 637                             OBJ_PROP_LINK_STRONG);
 638}
 639
 640static const VMStateDescription vmstate_psx_rpu_cluster = {
 641    .name = TYPE_XILINX_PSX_RPU_CLUSTER,
 642    .version_id = 1,
 643    .minimum_version_id = 1,
 644    .fields = (VMStateField[]) {
 645        VMSTATE_UINT32_ARRAY(regs, PSX_RPU_CLUSTER, PSX_RPU_CLUSTER_R_MAX),
 646        VMSTATE_END_OF_LIST(),
 647    }
 648};
 649
 650static Property psx_rpu_cluster_prop[] = {
 651    DEFINE_PROP_UINT32("axis-base", PSX_RPU_CLUSTER, axis_base,
 652                       0xFF000000),
 653    DEFINE_PROP_END_OF_LIST(),
 654};
 655
 656static void psx_rpu_cluster_class_init(ObjectClass *klass, void *data)
 657{
 658    ResettableClass *rc = RESETTABLE_CLASS(klass);
 659    DeviceClass *dc = DEVICE_CLASS(klass);
 660
 661    dc->vmsd = &vmstate_psx_rpu_cluster;
 662    rc->phases.enter = psx_rpu_cluster_reset_enter;
 663    rc->phases.hold = psx_rpu_cluster_reset_hold;
 664    device_class_set_props(dc, psx_rpu_cluster_prop);
 665}
 666
 667static const TypeInfo psx_rpu_cluster_info = {
 668    .name          = TYPE_XILINX_PSX_RPU_CLUSTER,
 669    .parent        = TYPE_SYS_BUS_DEVICE,
 670    .instance_size = sizeof(PSX_RPU_CLUSTER),
 671    .class_init    = psx_rpu_cluster_class_init,
 672    .instance_init = psx_rpu_cluster_init,
 673};
 674
 675static void psx_rpu_cluster_register_types(void)
 676{
 677    type_register_static(&psx_rpu_cluster_info);
 678}
 679
 680type_init(psx_rpu_cluster_register_types)
 681