* ensure the elements themselves meet the requirement.
         */
        BUILD_BUG_ON(!is_power_of_2(GSI_RING_ELEMENT_SIZE));
-
-       /* The event ring element size must fit in this field */
-       BUILD_BUG_ON(GSI_RING_ELEMENT_SIZE > field_max(EV_ELEMENT_SIZE_FMASK));
 }
 
 /* Return the channel id associated with a given channel */
 
        val = ioread32(gsi->virt + reg_n_offset(reg, evt_ring_id));
 
-       return u32_get_bits(val, EV_CHSTATE_FMASK);
+       return reg_decode(reg, EV_CHSTATE, val);
 }
 
 /* Issue an event ring command and wait for it to complete */
 
        reg = gsi_reg(gsi, EV_CH_E_CNTXT_0);
        /* We program all event rings as GPI type/protocol */
-       val = u32_encode_bits(GSI_CHANNEL_TYPE_GPI, EV_CHTYPE_FMASK);
-       val |= EV_INTYPE_FMASK;
-       val |= u32_encode_bits(GSI_RING_ELEMENT_SIZE, EV_ELEMENT_SIZE_FMASK);
+       val = reg_encode(reg, EV_CHTYPE, GSI_CHANNEL_TYPE_GPI);
+       /* EV_EE field is 0 (GSI_EE_AP) */
+       val |= reg_bit(reg, EV_INTYPE);
+       val |= reg_encode(reg, EV_ELEMENT_SIZE, GSI_RING_ELEMENT_SIZE);
        iowrite32(val, gsi->virt + reg_n_offset(reg, evt_ring_id));
 
        reg = gsi_reg(gsi, EV_CH_E_CNTXT_1);
 
        /* Enable interrupt moderation by setting the moderation delay */
        reg = gsi_reg(gsi, EV_CH_E_CNTXT_8);
-       val = u32_encode_bits(GSI_EVT_RING_INT_MODT, MODT_FMASK);
-       val |= u32_encode_bits(1, MODC_FMASK);  /* comes from channel */
+       val = reg_encode(reg, EV_MODT, GSI_EVT_RING_INT_MODT);
+       val = reg_encode(reg, EV_MODC, 1);      /* comes from channel */
+       /* EV_MOD_CNT is 0 (no counter-based interrupt coalescing) */
        iowrite32(val, gsi->virt + reg_n_offset(reg, evt_ring_id));
 
-       /* No MSI write data, and MSI address high and low address is 0 */
+       /* No MSI write data, and MSI high and low address is 0 */
        reg = gsi_reg(gsi, EV_CH_E_CNTXT_9);
        iowrite32(0, gsi->virt + reg_n_offset(reg, evt_ring_id));
 
 
 };
 
 /* EV_CH_E_CNTXT_0 register */
-/* enum gsi_channel_type defines EV_CHTYPE field values in EV_CH_E_CNTXT_0 */
-#define EV_CHTYPE_FMASK                        GENMASK(3, 0)
-#define EV_EE_FMASK                    GENMASK(7, 4)
-#define EV_EVCHID_FMASK                        GENMASK(15, 8)
-#define EV_INTYPE_FMASK                        GENMASK(16, 16)
-#define EV_CHSTATE_FMASK               GENMASK(23, 20)
-#define EV_ELEMENT_SIZE_FMASK          GENMASK(31, 24)
+enum gsi_reg_ch_c_ev_ch_e_cntxt_0_field_id {
+       EV_CHTYPE,      /* enum gsi_channel_type */
+       EV_EE,          /* enum gsi_ee_id; always GSI_EE_AP for us */
+       EV_EVCHID,
+       EV_INTYPE,
+       EV_CHSTATE,
+       EV_ELEMENT_SIZE,
+};
 
 /* EV_CH_E_CNTXT_8 register */
-#define MODT_FMASK                     GENMASK(15, 0)
-#define MODC_FMASK                     GENMASK(23, 16)
-#define MOD_CNT_FMASK                  GENMASK(31, 24)
+enum gsi_reg_ch_c_ev_ch_e_cntxt_8_field_id {
+       EV_MODT,
+       EV_MODC,
+       EV_MOD_CNT,
+};
 
 /* GSI_STATUS register */
 #define ENABLED_FMASK                  GENMASK(0, 0)
 
 REG_STRIDE(CH_C_SCRATCH_3, ch_c_scratch_3,
           0x0001c06c + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
-          0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_0_fmask[] = {
+       [EV_CHTYPE]                                     = GENMASK(3, 0),
+       [EV_EE]                                         = GENMASK(7, 4),
+       [EV_EVCHID]                                     = GENMASK(15, 8),
+       [EV_INTYPE]                                     = BIT(16),
+                                               /* Bits 17-19 reserved */
+       [EV_CHSTATE]                                    = GENMASK(23, 20),
+       [EV_ELEMENT_SIZE]                               = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
+                 0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_1, ev_ch_e_cntxt_1,
           0x0001d004 + 0x4000 * GSI_EE_AP, 0x80);
 REG_STRIDE(EV_CH_E_CNTXT_4, ev_ch_e_cntxt_4,
           0x0001d010 + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
-          0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_8_fmask[] = {
+       [EV_MODT]                                       = GENMASK(15, 0),
+       [EV_MODC]                                       = GENMASK(23, 16),
+       [EV_MOD_CNT]                                    = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
+                 0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_9, ev_ch_e_cntxt_9,
           0x0001d024 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(CH_C_SCRATCH_3, ch_c_scratch_3,
           0x0001c06c + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
-          0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_0_fmask[] = {
+       [EV_CHTYPE]                                     = GENMASK(3, 0),
+       [EV_EE]                                         = GENMASK(7, 4),
+       [EV_EVCHID]                                     = GENMASK(15, 8),
+       [EV_INTYPE]                                     = BIT(16),
+                                               /* Bits 17-19 reserved */
+       [EV_CHSTATE]                                    = GENMASK(23, 20),
+       [EV_ELEMENT_SIZE]                               = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
+                 0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_1, ev_ch_e_cntxt_1,
           0x0001d004 + 0x4000 * GSI_EE_AP, 0x80);
 REG_STRIDE(EV_CH_E_CNTXT_4, ev_ch_e_cntxt_4,
           0x0001d010 + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
-          0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_8_fmask[] = {
+       [EV_MODT]                                       = GENMASK(15, 0),
+       [EV_MODC]                                       = GENMASK(23, 16),
+       [EV_MOD_CNT]                                    = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
+                 0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_9, ev_ch_e_cntxt_9,
           0x0001d024 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(CH_C_SCRATCH_3, ch_c_scratch_3,
           0x0001c06c + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
-          0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_0_fmask[] = {
+       [EV_CHTYPE]                                     = GENMASK(3, 0),
+       [EV_EE]                                         = GENMASK(7, 4),
+       [EV_EVCHID]                                     = GENMASK(15, 8),
+       [EV_INTYPE]                                     = BIT(16),
+                                               /* Bits 17-19 reserved */
+       [EV_CHSTATE]                                    = GENMASK(23, 20),
+       [EV_ELEMENT_SIZE]                               = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
+                 0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_1, ev_ch_e_cntxt_1,
           0x0001d004 + 0x4000 * GSI_EE_AP, 0x80);
 REG_STRIDE(EV_CH_E_CNTXT_4, ev_ch_e_cntxt_4,
           0x0001d010 + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
-          0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_8_fmask[] = {
+       [EV_MODT]                                       = GENMASK(15, 0),
+       [EV_MODC]                                       = GENMASK(23, 16),
+       [EV_MOD_CNT]                                    = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
+                 0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_9, ev_ch_e_cntxt_9,
           0x0001d024 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(CH_C_SCRATCH_3, ch_c_scratch_3,
           0x0001c06c + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
-          0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_0_fmask[] = {
+       [EV_CHTYPE]                                     = GENMASK(3, 0),
+       [EV_EE]                                         = GENMASK(7, 4),
+       [EV_EVCHID]                                     = GENMASK(15, 8),
+       [EV_INTYPE]                                     = BIT(16),
+                                               /* Bits 17-19 reserved */
+       [EV_CHSTATE]                                    = GENMASK(23, 20),
+       [EV_ELEMENT_SIZE]                               = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
+                 0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_1, ev_ch_e_cntxt_1,
           0x0001d004 + 0x4000 * GSI_EE_AP, 0x80);
 REG_STRIDE(EV_CH_E_CNTXT_4, ev_ch_e_cntxt_4,
           0x0001d010 + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
-          0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_8_fmask[] = {
+       [EV_MODT]                                       = GENMASK(15, 0),
+       [EV_MODC]                                       = GENMASK(23, 16),
+       [EV_MOD_CNT]                                    = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
+                 0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_9, ev_ch_e_cntxt_9,
           0x0001d024 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(CH_C_SCRATCH_3, ch_c_scratch_3,
           0x0001c06c + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
-          0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_0_fmask[] = {
+       [EV_CHTYPE]                                     = GENMASK(3, 0),
+       [EV_EE]                                         = GENMASK(7, 4),
+       [EV_EVCHID]                                     = GENMASK(15, 8),
+       [EV_INTYPE]                                     = BIT(16),
+                                               /* Bits 17-19 reserved */
+       [EV_CHSTATE]                                    = GENMASK(23, 20),
+       [EV_ELEMENT_SIZE]                               = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_0, ev_ch_e_cntxt_0,
+                 0x0001d000 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_1, ev_ch_e_cntxt_1,
           0x0001d004 + 0x4000 * GSI_EE_AP, 0x80);
 REG_STRIDE(EV_CH_E_CNTXT_4, ev_ch_e_cntxt_4,
           0x0001d010 + 0x4000 * GSI_EE_AP, 0x80);
 
-REG_STRIDE(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
-          0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
+static const u32 reg_ev_ch_e_cntxt_8_fmask[] = {
+       [EV_MODT]                                       = GENMASK(15, 0),
+       [EV_MODC]                                       = GENMASK(23, 16),
+       [EV_MOD_CNT]                                    = GENMASK(31, 24),
+};
+
+REG_STRIDE_FIELDS(EV_CH_E_CNTXT_8, ev_ch_e_cntxt_8,
+                 0x0001d020 + 0x4000 * GSI_EE_AP, 0x80);
 
 REG_STRIDE(EV_CH_E_CNTXT_9, ev_ch_e_cntxt_9,
           0x0001d024 + 0x4000 * GSI_EE_AP, 0x80);