Reviewed-by: Marco Liebel <[email protected]>
Signed-off-by: Brian Cain <[email protected]>
---
 hw/hexagon/hexagon_hmx_context.c | 117 +++++++++++++++++++++++++++++++
 1 file changed, 117 insertions(+)

diff --git a/hw/hexagon/hexagon_hmx_context.c b/hw/hexagon/hexagon_hmx_context.c
index e3ea7b71474..3683bd9d416 100644
--- a/hw/hexagon/hexagon_hmx_context.c
+++ b/hw/hexagon/hexagon_hmx_context.c
@@ -7,6 +7,7 @@
 
 #include "qemu/osdep.h"
 #include "hw/hexagon/hexagon_hmx_context.h"
+#include "migration/vmstate.h"
 
 static void hexagon_hmx_context_reset_hold(Object *obj, ResetType type)
 {
@@ -15,6 +16,121 @@ static void hexagon_hmx_context_reset_hold(Object *obj, 
ResetType type)
     memset(&s->regs, 0, sizeof(s->regs));
 }
 
+static const VMStateDescription vmstate_hmx_acc_fxp = {
+    .name = "hexagon_hmx_acc_fxp",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (const VMStateField[]) {
+        VMSTATE_2DARRAY(data, HmxAccFxp, HMX_SPATIAL_DIM_FXP,
+                        HMX_OUTPUT_CHANNELS, 0, vmstate_info_int32, int32_t),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+static const VMStateDescription vmstate_hmx_acc_fp = {
+    .name = "hexagon_hmx_acc_fp",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (const VMStateField[]) {
+        VMSTATE_UINT64_2DARRAY(data, HmxAccFp, HMX_SPATIAL_DIM_FP,
+                               HMX_OUTPUT_CHANNELS),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+static const VMStateDescription vmstate_hmx_acc_set = {
+    .name = "hexagon_hmx_acc_set",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (const VMStateField[]) {
+        VMSTATE_STRUCT(fxp_primary, HmxAccSet, 0, vmstate_hmx_acc_fxp,
+                       HmxAccFxp),
+        VMSTATE_STRUCT(fp_primary, HmxAccSet, 0, vmstate_hmx_acc_fp,
+                       HmxAccFp),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+static const VMStateDescription vmstate_hmx_cvt_fxp = {
+    .name = "hexagon_hmx_cvt_fxp",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (const VMStateField[]) {
+        VMSTATE_UINT16_2DARRAY(data, HmxCvtStateFxp, HMX_SPATIAL_DIM_FXP,
+                               HMX_OUTPUT_CHANNELS),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+static const VMStateDescription vmstate_hmx_cvt_fp = {
+    .name = "hexagon_hmx_cvt_fp",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (const VMStateField[]) {
+        VMSTATE_UINT16_2DARRAY(data, HmxCvtStateFp, HMX_SPATIAL_DIM_FP,
+                               HMX_OUTPUT_CHANNELS),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+static const VMStateDescription vmstate_hmx_regs = {
+    .name = "hexagon_hmx_regs",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (const VMStateField[]) {
+        VMSTATE_STRUCT_ARRAY(acc, HmxState, HMX_NUM_ACC_SETS, 0,
+                             vmstate_hmx_acc_set, HmxAccSet),
+        VMSTATE_STRUCT_ARRAY(cvt_fxp, HmxState, HMX_NUM_CVT_AGES, 0,
+                             vmstate_hmx_cvt_fxp, HmxCvtStateFxp),
+        VMSTATE_STRUCT_ARRAY(cvt_fp, HmxState, HMX_NUM_CVT_AGES, 0,
+                             vmstate_hmx_cvt_fp, HmxCvtStateFp),
+        VMSTATE_STRUCT(cvt_future_fxp, HmxState, 0, vmstate_hmx_cvt_fxp,
+                       HmxCvtStateFxp),
+        VMSTATE_UINT64_2DARRAY(bias_raw, HmxState, HMX_NUM_BIAS_SETS,
+                               HMX_OUTPUT_CHANNELS),
+        VMSTATE_UINT32(current_acc_set, HmxState),
+        VMSTATE_BUFFER(act_buffer, HmxState),
+        VMSTATE_UINT32(act_rs, HmxState),
+        VMSTATE_UINT32(act_type, HmxState),
+        VMSTATE_UINT8(is_f8_odd, HmxState),
+        VMSTATE_UINT8(fp8_odd_sel, HmxState),
+        VMSTATE_UINT32(format_offset, HmxState),
+        VMSTATE_UINT32(tile_x_mask, HmxState),
+        VMSTATE_UINT32(tile_y_mask, HmxState),
+        VMSTATE_UINT32(tile_x_inc, HmxState),
+        VMSTATE_UINT32(tile_y_inc, HmxState),
+        VMSTATE_UINT32(fx, HmxState),
+        VMSTATE_UINT32(fy, HmxState),
+        VMSTATE_INT32(ch_start, HmxState),
+        VMSTATE_INT32(ch_stop, HmxState),
+        VMSTATE_UINT32(y_start, HmxState),
+        VMSTATE_UINT32(y_stop, HmxState),
+        VMSTATE_UINT32(y_dilate, HmxState),
+        VMSTATE_UINT32(blocks, HmxState),
+        VMSTATE_INT32(dY, HmxState),
+        VMSTATE_UINT32(group_conv, HmxState),
+        VMSTATE_UINT32(group_size, HmxState),
+        VMSTATE_UINT32(group_count, HmxState),
+        VMSTATE_INT32(mac_cycle_limit, HmxState),
+        VMSTATE_UINT32(cvt_fxp_pending, HmxState),
+        VMSTATE_UINT32(cvt_fxp_pending_age, HmxState),
+        VMSTATE_UINT32(cvt_acc_clear_pending, HmxState),
+        VMSTATE_UINT32(cvt_acc_clear_set, HmxState),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
+static const VMStateDescription vmstate_hexagon_hmx_context = {
+    .name = "hexagon_hmx_context",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .fields = (const VMStateField[]) {
+        VMSTATE_STRUCT(regs, HexagonHMXContextState, 1, vmstate_hmx_regs,
+                       HmxState),
+        VMSTATE_END_OF_LIST()
+    },
+};
+
 static void hexagon_hmx_context_class_init(ObjectClass *klass,
                                            const void *data)
 {
@@ -22,6 +138,7 @@ static void hexagon_hmx_context_class_init(ObjectClass 
*klass,
     ResettableClass *rc = RESETTABLE_CLASS(klass);
 
     rc->phases.hold = hexagon_hmx_context_reset_hold;
+    dc->vmsd = &vmstate_hexagon_hmx_context;
     dc->user_creatable = false;
 }
 
-- 
2.34.1

Reply via email to