ipa_resource.o ipa_qmi.o ipa_qmi_msg.o \
                                ipa_sysfs.o
 
+ipa-y                  +=      $(IPA_VERSIONS:%=reg/ipa_reg-v%.o)
+
 ipa-y                  +=      $(IPA_VERSIONS:%=data/ipa_data-v%.o)
 
  * @uc_loaded:         true after microcontroller has reported it's ready
  * @reg_addr:          DMA address used for IPA register access
  * @reg_virt:          Virtual address used for IPA register access
+ * @regs:              IPA register definitions
  * @mem_addr:          DMA address of IPA-local memory space
  * @mem_virt:          Virtual address of IPA-local memory space
  * @mem_offset:                Offset from @mem_virt used for access to IPA memory
 
        dma_addr_t reg_addr;
        void __iomem *reg_virt;
+       const struct ipa_regs *regs;
 
        dma_addr_t mem_addr;
        void *mem_virt;
 
 #include "ipa.h"
 #include "ipa_reg.h"
 
-/* Is this register valid for the current IPA version? */
+/* Is this register valid and defined for the current IPA version? */
 static bool ipa_reg_valid(struct ipa *ipa, enum ipa_reg_id reg_id)
 {
        enum ipa_version version = ipa->version;
        bool valid;
 
        /* Check for bogus (out of range) register IDs */
-       if ((u32)reg_id >= IPA_REG_ID_COUNT)
+       if ((u32)reg_id >= ipa->regs->reg_count)
                return false;
 
        switch (reg_id) {
                break;
        }
 
-       return valid;
+       /* To be valid, it must be defined */
+
+       return valid && ipa->regs->reg[reg_id];
 }
 
 /* Assumes the endpoint transfer direction is valid; 0 is a bad offset */
        }
 }
 
+static const struct ipa_regs *ipa_regs(enum ipa_version version)
+{
+       switch (version) {
+       case IPA_VERSION_3_1:
+               return &ipa_regs_v3_1;
+       case IPA_VERSION_3_5_1:
+               return &ipa_regs_v3_5_1;
+       case IPA_VERSION_4_2:
+               return &ipa_regs_v4_2;
+       case IPA_VERSION_4_5:
+               return &ipa_regs_v4_5;
+       case IPA_VERSION_4_9:
+               return &ipa_regs_v4_9;
+       case IPA_VERSION_4_11:
+               return &ipa_regs_v4_11;
+       default:
+               return NULL;
+       }
+}
+
 int ipa_reg_init(struct ipa *ipa)
 {
        struct device *dev = &ipa->pdev->dev;
+       const struct ipa_regs *regs;
        struct resource *res;
 
+       regs = ipa_regs(ipa->version);
+       if (!regs)
+               return -EINVAL;
+
+       if (WARN_ON(regs->reg_count > IPA_REG_ID_COUNT))
+               return -EINVAL;
+
        /* Setup IPA register memory  */
        res = platform_get_resource_byname(ipa->pdev, IORESOURCE_MEM,
                                           "ipa-reg");
                return -ENOMEM;
        }
        ipa->reg_addr = res->start;
+       ipa->regs = regs;
 
        return 0;
 }
 
 #define _IPA_REG_H_
 
 #include <linux/bitfield.h>
+#include <linux/bug.h>
 
 #include "ipa_version.h"
 
        IPA_REG_ID_COUNT,                               /* Last; not an ID */
 };
 
+/**
+ * struct ipa_reg - An IPA register descriptor
+ * @offset:    Register offset relative to base of the "ipa-reg" memory
+ * @stride:    Distance between two instances, if parameterized
+ * @name:      Upper-case name of the IPA register
+ */
+struct ipa_reg {
+       u32 offset;
+       u32 stride;
+       const char *name;
+};
+
+/* Helper macro for defining "simple" (non-parameterized) registers */
+#define IPA_REG(__NAME, __reg_id, __offset)                            \
+       IPA_REG_STRIDE(__NAME, __reg_id, __offset, 0)
+
+/* Helper macro for defining parameterized registers, specifying stride */
+#define IPA_REG_STRIDE(__NAME, __reg_id, __offset, __stride)           \
+       static const struct ipa_reg ipa_reg_ ## __reg_id = {            \
+               .name   = #__NAME,                                      \
+               .offset = __offset,                                     \
+               .stride = __stride,                                     \
+       }
+
+/**
+ * struct ipa_regs - Description of registers supported by hardware
+ * @reg_count: Number of registers in the @reg[] array
+ * @reg:               Array of register descriptors
+ */
+struct ipa_regs {
+       u32 reg_count;
+       const struct ipa_reg **reg;
+};
+
 #define IPA_REG_COMP_CFG_OFFSET                                0x0000003c
 /* The next field is not supported for IPA v4.0+, not present for IPA v4.5+ */
 #define ENABLE_FMASK                           GENMASK(0, 0)
        return ipa_reg_irq_suspend_clr_ee_n_offset(version, GSI_EE_AP);
 }
 
+extern const struct ipa_regs ipa_regs_v3_1;
+extern const struct ipa_regs ipa_regs_v3_5_1;
+extern const struct ipa_regs ipa_regs_v4_2;
+extern const struct ipa_regs ipa_regs_v4_5;
+extern const struct ipa_regs ipa_regs_v4_9;
+extern const struct ipa_regs ipa_regs_v4_11;
+
 u32 __ipa_reg_offset(struct ipa *ipa, enum ipa_reg_id reg_id, u32 n);
 
+const struct ipa_reg *ipa_reg(struct ipa *ipa, enum ipa_reg_id reg_id);
+
 static inline u32 ipa_reg_offset(struct ipa *ipa, enum ipa_reg_id reg_id)
 {
        return __ipa_reg_offset(ipa, reg_id, 0);
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+/* Copyright (C) 2022 Linaro Ltd. */
+
+#include <linux/types.h>
+
+#include "../ipa.h"
+#include "../ipa_reg.h"
+
+IPA_REG(COMP_CFG, comp_cfg, 0x0000003c);
+
+IPA_REG(CLKON_CFG, clkon_cfg, 0x00000044);
+
+IPA_REG(ROUTE, route, 0x00000048);
+
+IPA_REG(SHARED_MEM_SIZE, shared_mem_size, 0x00000054);
+
+IPA_REG(QSB_MAX_WRITES, qsb_max_writes, 0x00000074);
+
+IPA_REG(QSB_MAX_READS, qsb_max_reads, 0x00000078);
+
+IPA_REG(FILT_ROUT_HASH_EN, filt_rout_hash_en, 0x000008c);
+
+IPA_REG(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x0000090);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x0000010c);
+
+IPA_REG(IPA_BCR, ipa_bcr, 0x000001d0);
+
+/* Offset must be a multiple of 8 */
+IPA_REG(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
+
+IPA_REG(COUNTER_CFG, counter_cfg, 0x000001f0);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_01_RSRC_TYPE, src_rsrc_grp_01_rsrc_type,
+              0x00000400, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_23_RSRC_TYPE, src_rsrc_grp_23_rsrc_type,
+              0x00000404, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_45_RSRC_TYPE, src_rsrc_grp_45_rsrc_type,
+              0x00000408, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_67_RSRC_TYPE, src_rsrc_grp_67_rsrc_type,
+              0x0000040c, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_01_RSRC_TYPE, dst_rsrc_grp_01_rsrc_type,
+              0x00000500, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_23_RSRC_TYPE, dst_rsrc_grp_23_rsrc_type,
+              0x00000504, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_45_RSRC_TYPE, dst_rsrc_grp_45_rsrc_type,
+              0x00000508, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_67_RSRC_TYPE, dst_rsrc_grp_67_rsrc_type,
+              0x0000050c, 0x0020);
+
+IPA_REG_STRIDE(ENDP_INIT_CTRL, endp_init_ctrl, 0x00000800, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_CFG, endp_init_cfg, 0x00000808, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_NAT, endp_init_nat, 0x0000080c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR, endp_init_hdr, 0x00000810, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_EXT, endp_init_hdr_ext, 0x00000814, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_METADATA_MASK, endp_init_hdr_metadata_mask,
+              0x00000818, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_MODE, endp_init_mode, 0x00000820, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_AGGR, endp_init_aggr, 0x00000824, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_EN, endp_init_hol_block_en,
+              0x0000082c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_TIMER, endp_init_hol_block_timer,
+              0x00000830, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_DEAGGR, endp_init_deaggr, 0x00000834, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_RSRC_GRP, endp_init_rsrc_grp, 0x00000838, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_SEQ, endp_init_seq, 0x0000083c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_STATUS, endp_status, 0x00000840, 0x0070);
+
+IPA_REG_STRIDE(ENDP_FILTER_ROUTER_HSH_CFG, endp_filter_router_hsh_cfg,
+              0x0000085c, 0x0070);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_STTS, ipa_irq_stts, 0x00003008 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_EN, ipa_irq_en, 0x0000300c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_CLR, ipa_irq_clr, 0x00003010 + 0x1000 * GSI_EE_AP);
+
+IPA_REG(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
+
+static const struct ipa_reg *ipa_reg_array[] = {
+       [COMP_CFG]                      = &ipa_reg_comp_cfg,
+       [CLKON_CFG]                     = &ipa_reg_clkon_cfg,
+       [ROUTE]                         = &ipa_reg_route,
+       [SHARED_MEM_SIZE]               = &ipa_reg_shared_mem_size,
+       [QSB_MAX_WRITES]                = &ipa_reg_qsb_max_writes,
+       [QSB_MAX_READS]                 = &ipa_reg_qsb_max_reads,
+       [FILT_ROUT_HASH_EN]             = &ipa_reg_filt_rout_hash_en,
+       [FILT_ROUT_HASH_FLUSH]          = &ipa_reg_filt_rout_hash_flush,
+       [STATE_AGGR_ACTIVE]             = &ipa_reg_state_aggr_active,
+       [IPA_BCR]                       = &ipa_reg_ipa_bcr,
+       [LOCAL_PKT_PROC_CNTXT]          = &ipa_reg_local_pkt_proc_cntxt,
+       [AGGR_FORCE_CLOSE]              = &ipa_reg_aggr_force_close,
+       [COUNTER_CFG]                   = &ipa_reg_counter_cfg,
+       [SRC_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_01_rsrc_type,
+       [SRC_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_23_rsrc_type,
+       [SRC_RSRC_GRP_45_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_45_rsrc_type,
+       [SRC_RSRC_GRP_67_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_67_rsrc_type,
+       [DST_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_01_rsrc_type,
+       [DST_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_23_rsrc_type,
+       [DST_RSRC_GRP_45_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_45_rsrc_type,
+       [DST_RSRC_GRP_67_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_67_rsrc_type,
+       [ENDP_INIT_CTRL]                = &ipa_reg_endp_init_ctrl,
+       [ENDP_INIT_CFG]                 = &ipa_reg_endp_init_cfg,
+       [ENDP_INIT_NAT]                 = &ipa_reg_endp_init_nat,
+       [ENDP_INIT_HDR]                 = &ipa_reg_endp_init_hdr,
+       [ENDP_INIT_HDR_EXT]             = &ipa_reg_endp_init_hdr_ext,
+       [ENDP_INIT_HDR_METADATA_MASK]   = &ipa_reg_endp_init_hdr_metadata_mask,
+       [ENDP_INIT_MODE]                = &ipa_reg_endp_init_mode,
+       [ENDP_INIT_AGGR]                = &ipa_reg_endp_init_aggr,
+       [ENDP_INIT_HOL_BLOCK_EN]        = &ipa_reg_endp_init_hol_block_en,
+       [ENDP_INIT_HOL_BLOCK_TIMER]     = &ipa_reg_endp_init_hol_block_timer,
+       [ENDP_INIT_DEAGGR]              = &ipa_reg_endp_init_deaggr,
+       [ENDP_INIT_RSRC_GRP]            = &ipa_reg_endp_init_rsrc_grp,
+       [ENDP_INIT_SEQ]                 = &ipa_reg_endp_init_seq,
+       [ENDP_STATUS]                   = &ipa_reg_endp_status,
+       [ENDP_FILTER_ROUTER_HSH_CFG]    = &ipa_reg_endp_filter_router_hsh_cfg,
+       [IPA_IRQ_STTS]                  = &ipa_reg_ipa_irq_stts,
+       [IPA_IRQ_EN]                    = &ipa_reg_ipa_irq_en,
+       [IPA_IRQ_CLR]                   = &ipa_reg_ipa_irq_clr,
+       [IPA_IRQ_UC]                    = &ipa_reg_ipa_irq_uc,
+       [IRQ_SUSPEND_INFO]              = &ipa_reg_irq_suspend_info,
+       [IRQ_SUSPEND_EN]                = &ipa_reg_irq_suspend_en,
+       [IRQ_SUSPEND_CLR]               = &ipa_reg_irq_suspend_clr,
+};
+
+const struct ipa_regs ipa_regs_v3_1 = {
+       .reg_count      = ARRAY_SIZE(ipa_reg_array),
+       .reg            = ipa_reg_array,
+};
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+/* Copyright (C) 2022 Linaro Ltd. */
+
+#include <linux/types.h>
+
+#include "../ipa.h"
+#include "../ipa_reg.h"
+
+IPA_REG(COMP_CFG, comp_cfg, 0x0000003c);
+
+IPA_REG(CLKON_CFG, clkon_cfg, 0x00000044);
+
+IPA_REG(ROUTE, route, 0x00000048);
+
+IPA_REG(SHARED_MEM_SIZE, shared_mem_size, 0x00000054);
+
+IPA_REG(QSB_MAX_WRITES, qsb_max_writes, 0x00000074);
+
+IPA_REG(QSB_MAX_READS, qsb_max_reads, 0x00000078);
+
+IPA_REG(FILT_ROUT_HASH_EN, filt_rout_hash_en, 0x000008c);
+
+IPA_REG(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x0000090);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x0000010c);
+
+IPA_REG(IPA_BCR, ipa_bcr, 0x000001d0);
+
+/* Offset must be a multiple of 8 */
+IPA_REG(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
+
+IPA_REG(COUNTER_CFG, counter_cfg, 0x000001f0);
+
+IPA_REG(IPA_TX_CFG, ipa_tx_cfg, 0x000001fc);
+
+IPA_REG(FLAVOR_0, flavor_0, 0x00000210);
+
+IPA_REG(IDLE_INDICATION_CFG, idle_indication_cfg, 0x00000220);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_01_RSRC_TYPE, src_rsrc_grp_01_rsrc_type,
+              0x00000400, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_23_RSRC_TYPE, src_rsrc_grp_23_rsrc_type,
+              0x00000404, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_01_RSRC_TYPE, dst_rsrc_grp_01_rsrc_type,
+              0x00000500, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_23_RSRC_TYPE, dst_rsrc_grp_23_rsrc_type,
+              0x00000504, 0x0020);
+
+IPA_REG_STRIDE(ENDP_INIT_CTRL, endp_init_ctrl, 0x00000800, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_CFG, endp_init_cfg, 0x00000808, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_NAT, endp_init_nat, 0x0000080c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR, endp_init_hdr, 0x00000810, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_EXT, endp_init_hdr_ext, 0x00000814, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_METADATA_MASK, endp_init_hdr_metadata_mask,
+              0x00000818, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_MODE, endp_init_mode, 0x00000820, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_AGGR, endp_init_aggr, 0x00000824, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_EN, endp_init_hol_block_en,
+              0x0000082c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_TIMER, endp_init_hol_block_timer,
+              0x00000830, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_DEAGGR, endp_init_deaggr, 0x00000834, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_RSRC_GRP, endp_init_rsrc_grp, 0x00000838, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_SEQ, endp_init_seq, 0x0000083c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_STATUS, endp_status, 0x00000840, 0x0070);
+
+IPA_REG_STRIDE(ENDP_FILTER_ROUTER_HSH_CFG, endp_filter_router_hsh_cfg,
+              0x0000085c, 0x0070);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_STTS, ipa_irq_stts, 0x00003008 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_EN, ipa_irq_en, 0x0000300c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_CLR, ipa_irq_clr, 0x00003010 + 0x1000 * GSI_EE_AP);
+
+IPA_REG(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
+
+static const struct ipa_reg *ipa_reg_array[] = {
+       [COMP_CFG]                      = &ipa_reg_comp_cfg,
+       [CLKON_CFG]                     = &ipa_reg_clkon_cfg,
+       [ROUTE]                         = &ipa_reg_route,
+       [SHARED_MEM_SIZE]               = &ipa_reg_shared_mem_size,
+       [QSB_MAX_WRITES]                = &ipa_reg_qsb_max_writes,
+       [QSB_MAX_READS]                 = &ipa_reg_qsb_max_reads,
+       [FILT_ROUT_HASH_EN]             = &ipa_reg_filt_rout_hash_en,
+       [FILT_ROUT_HASH_FLUSH]          = &ipa_reg_filt_rout_hash_flush,
+       [STATE_AGGR_ACTIVE]             = &ipa_reg_state_aggr_active,
+       [IPA_BCR]                       = &ipa_reg_ipa_bcr,
+       [LOCAL_PKT_PROC_CNTXT]          = &ipa_reg_local_pkt_proc_cntxt,
+       [AGGR_FORCE_CLOSE]              = &ipa_reg_aggr_force_close,
+       [COUNTER_CFG]                   = &ipa_reg_counter_cfg,
+       [IPA_TX_CFG]                    = &ipa_reg_ipa_tx_cfg,
+       [FLAVOR_0]                      = &ipa_reg_flavor_0,
+       [IDLE_INDICATION_CFG]           = &ipa_reg_idle_indication_cfg,
+       [SRC_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_01_rsrc_type,
+       [SRC_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_23_rsrc_type,
+       [DST_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_01_rsrc_type,
+       [DST_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_23_rsrc_type,
+       [ENDP_INIT_CTRL]                = &ipa_reg_endp_init_ctrl,
+       [ENDP_INIT_CFG]                 = &ipa_reg_endp_init_cfg,
+       [ENDP_INIT_NAT]                 = &ipa_reg_endp_init_nat,
+       [ENDP_INIT_HDR]                 = &ipa_reg_endp_init_hdr,
+       [ENDP_INIT_HDR_EXT]             = &ipa_reg_endp_init_hdr_ext,
+       [ENDP_INIT_HDR_METADATA_MASK]   = &ipa_reg_endp_init_hdr_metadata_mask,
+       [ENDP_INIT_MODE]                = &ipa_reg_endp_init_mode,
+       [ENDP_INIT_AGGR]                = &ipa_reg_endp_init_aggr,
+       [ENDP_INIT_HOL_BLOCK_EN]        = &ipa_reg_endp_init_hol_block_en,
+       [ENDP_INIT_HOL_BLOCK_TIMER]     = &ipa_reg_endp_init_hol_block_timer,
+       [ENDP_INIT_DEAGGR]              = &ipa_reg_endp_init_deaggr,
+       [ENDP_INIT_RSRC_GRP]            = &ipa_reg_endp_init_rsrc_grp,
+       [ENDP_INIT_SEQ]                 = &ipa_reg_endp_init_seq,
+       [ENDP_STATUS]                   = &ipa_reg_endp_status,
+       [ENDP_FILTER_ROUTER_HSH_CFG]    = &ipa_reg_endp_filter_router_hsh_cfg,
+       [IPA_IRQ_STTS]                  = &ipa_reg_ipa_irq_stts,
+       [IPA_IRQ_EN]                    = &ipa_reg_ipa_irq_en,
+       [IPA_IRQ_CLR]                   = &ipa_reg_ipa_irq_clr,
+       [IPA_IRQ_UC]                    = &ipa_reg_ipa_irq_uc,
+       [IRQ_SUSPEND_INFO]              = &ipa_reg_irq_suspend_info,
+       [IRQ_SUSPEND_EN]                = &ipa_reg_irq_suspend_en,
+       [IRQ_SUSPEND_CLR]               = &ipa_reg_irq_suspend_clr,
+};
+
+const struct ipa_regs ipa_regs_v3_5_1 = {
+       .reg_count      = ARRAY_SIZE(ipa_reg_array),
+       .reg            = ipa_reg_array,
+};
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+/* Copyright (C) 2022 Linaro Ltd. */
+
+#include <linux/types.h>
+
+#include "../ipa.h"
+#include "../ipa_reg.h"
+
+IPA_REG(COMP_CFG, comp_cfg, 0x0000003c);
+
+IPA_REG(CLKON_CFG, clkon_cfg, 0x00000044);
+
+IPA_REG(ROUTE, route, 0x00000048);
+
+IPA_REG(SHARED_MEM_SIZE, shared_mem_size, 0x00000054);
+
+IPA_REG(QSB_MAX_WRITES, qsb_max_writes, 0x00000074);
+
+IPA_REG(QSB_MAX_READS, qsb_max_reads, 0x00000078);
+
+IPA_REG(FILT_ROUT_HASH_EN, filt_rout_hash_en, 0x0000148);
+
+IPA_REG(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
+
+/* Offset must be a multiple of 8 */
+IPA_REG(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
+
+IPA_REG(IPA_TX_CFG, ipa_tx_cfg, 0x000001fc);
+
+IPA_REG(FLAVOR_0, flavor_0, 0x00000210);
+
+IPA_REG(IDLE_INDICATION_CFG, idle_indication_cfg, 0x00000240);
+
+IPA_REG(QTIME_TIMESTAMP_CFG, qtime_timestamp_cfg, 0x0000024c);
+
+IPA_REG(TIMERS_XO_CLK_DIV_CFG, timers_xo_clk_div_cfg, 0x00000250);
+
+IPA_REG(TIMERS_PULSE_GRAN_CFG, timers_pulse_gran_cfg, 0x00000254);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_01_RSRC_TYPE, src_rsrc_grp_01_rsrc_type,
+              0x00000400, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_23_RSRC_TYPE, src_rsrc_grp_23_rsrc_type,
+              0x00000404, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_01_RSRC_TYPE, dst_rsrc_grp_01_rsrc_type,
+              0x00000500, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_23_RSRC_TYPE, dst_rsrc_grp_23_rsrc_type,
+              0x00000504, 0x0020);
+
+IPA_REG_STRIDE(ENDP_INIT_CFG, endp_init_cfg, 0x00000808, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_NAT, endp_init_nat, 0x0000080c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR, endp_init_hdr, 0x00000810, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_EXT, endp_init_hdr_ext, 0x00000814, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_METADATA_MASK, endp_init_hdr_metadata_mask,
+              0x00000818, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_MODE, endp_init_mode, 0x00000820, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_AGGR, endp_init_aggr, 0x00000824, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_EN, endp_init_hol_block_en,
+              0x0000082c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_TIMER, endp_init_hol_block_timer,
+              0x00000830, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_DEAGGR, endp_init_deaggr, 0x00000834, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_RSRC_GRP, endp_init_rsrc_grp, 0x00000838, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_SEQ, endp_init_seq, 0x0000083c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_STATUS, endp_status, 0x00000840, 0x0070);
+
+IPA_REG_STRIDE(ENDP_FILTER_ROUTER_HSH_CFG, endp_filter_router_hsh_cfg,
+              0x0000085c, 0x0070);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_STTS, ipa_irq_stts, 0x00004008 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_EN, ipa_irq_en, 0x0000400c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_CLR, ipa_irq_clr, 0x00004010 + 0x1000 * GSI_EE_AP);
+
+IPA_REG(IPA_IRQ_UC, ipa_irq_uc, 0x0000401c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00004030 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00004034 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00004038 + 0x1000 * GSI_EE_AP);
+
+static const struct ipa_reg *ipa_reg_array[] = {
+       [COMP_CFG]                      = &ipa_reg_comp_cfg,
+       [CLKON_CFG]                     = &ipa_reg_clkon_cfg,
+       [ROUTE]                         = &ipa_reg_route,
+       [SHARED_MEM_SIZE]               = &ipa_reg_shared_mem_size,
+       [QSB_MAX_WRITES]                = &ipa_reg_qsb_max_writes,
+       [QSB_MAX_READS]                 = &ipa_reg_qsb_max_reads,
+       [FILT_ROUT_HASH_EN]             = &ipa_reg_filt_rout_hash_en,
+       [FILT_ROUT_HASH_FLUSH]          = &ipa_reg_filt_rout_hash_flush,
+       [STATE_AGGR_ACTIVE]             = &ipa_reg_state_aggr_active,
+       [LOCAL_PKT_PROC_CNTXT]          = &ipa_reg_local_pkt_proc_cntxt,
+       [AGGR_FORCE_CLOSE]              = &ipa_reg_aggr_force_close,
+       [IPA_TX_CFG]                    = &ipa_reg_ipa_tx_cfg,
+       [FLAVOR_0]                      = &ipa_reg_flavor_0,
+       [IDLE_INDICATION_CFG]           = &ipa_reg_idle_indication_cfg,
+       [QTIME_TIMESTAMP_CFG]           = &ipa_reg_qtime_timestamp_cfg,
+       [TIMERS_XO_CLK_DIV_CFG]         = &ipa_reg_timers_xo_clk_div_cfg,
+       [TIMERS_PULSE_GRAN_CFG]         = &ipa_reg_timers_pulse_gran_cfg,
+       [SRC_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_01_rsrc_type,
+       [SRC_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_23_rsrc_type,
+       [DST_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_01_rsrc_type,
+       [DST_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_23_rsrc_type,
+       [ENDP_INIT_CFG]                 = &ipa_reg_endp_init_cfg,
+       [ENDP_INIT_NAT]                 = &ipa_reg_endp_init_nat,
+       [ENDP_INIT_HDR]                 = &ipa_reg_endp_init_hdr,
+       [ENDP_INIT_HDR_EXT]             = &ipa_reg_endp_init_hdr_ext,
+       [ENDP_INIT_HDR_METADATA_MASK]   = &ipa_reg_endp_init_hdr_metadata_mask,
+       [ENDP_INIT_MODE]                = &ipa_reg_endp_init_mode,
+       [ENDP_INIT_AGGR]                = &ipa_reg_endp_init_aggr,
+       [ENDP_INIT_HOL_BLOCK_EN]        = &ipa_reg_endp_init_hol_block_en,
+       [ENDP_INIT_HOL_BLOCK_TIMER]     = &ipa_reg_endp_init_hol_block_timer,
+       [ENDP_INIT_DEAGGR]              = &ipa_reg_endp_init_deaggr,
+       [ENDP_INIT_RSRC_GRP]            = &ipa_reg_endp_init_rsrc_grp,
+       [ENDP_INIT_SEQ]                 = &ipa_reg_endp_init_seq,
+       [ENDP_STATUS]                   = &ipa_reg_endp_status,
+       [ENDP_FILTER_ROUTER_HSH_CFG]    = &ipa_reg_endp_filter_router_hsh_cfg,
+       [IPA_IRQ_STTS]                  = &ipa_reg_ipa_irq_stts,
+       [IPA_IRQ_EN]                    = &ipa_reg_ipa_irq_en,
+       [IPA_IRQ_CLR]                   = &ipa_reg_ipa_irq_clr,
+       [IPA_IRQ_UC]                    = &ipa_reg_ipa_irq_uc,
+       [IRQ_SUSPEND_INFO]              = &ipa_reg_irq_suspend_info,
+       [IRQ_SUSPEND_EN]                = &ipa_reg_irq_suspend_en,
+       [IRQ_SUSPEND_CLR]               = &ipa_reg_irq_suspend_clr,
+};
+
+const struct ipa_regs ipa_regs_v4_11 = {
+       .reg_count      = ARRAY_SIZE(ipa_reg_array),
+       .reg            = ipa_reg_array,
+};
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+/* Copyright (C) 2022 Linaro Ltd. */
+
+#include <linux/types.h>
+
+#include "../ipa.h"
+#include "../ipa_reg.h"
+
+IPA_REG(COMP_CFG, comp_cfg, 0x0000003c);
+
+IPA_REG(CLKON_CFG, clkon_cfg, 0x00000044);
+
+IPA_REG(ROUTE, route, 0x00000048);
+
+IPA_REG(SHARED_MEM_SIZE, shared_mem_size, 0x00000054);
+
+IPA_REG(QSB_MAX_WRITES, qsb_max_writes, 0x00000074);
+
+IPA_REG(QSB_MAX_READS, qsb_max_reads, 0x00000078);
+
+IPA_REG(FILT_ROUT_HASH_EN, filt_rout_hash_en, 0x0000148);
+
+IPA_REG(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
+
+IPA_REG(IPA_BCR, ipa_bcr, 0x000001d0);
+
+/* Offset must be a multiple of 8 */
+IPA_REG(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
+
+IPA_REG(COUNTER_CFG, counter_cfg, 0x000001f0);
+
+IPA_REG(IPA_TX_CFG, ipa_tx_cfg, 0x000001fc);
+
+IPA_REG(FLAVOR_0, flavor_0, 0x00000210);
+
+IPA_REG(IDLE_INDICATION_CFG, idle_indication_cfg, 0x00000240);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_01_RSRC_TYPE, src_rsrc_grp_01_rsrc_type,
+              0x00000400, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_23_RSRC_TYPE, src_rsrc_grp_23_rsrc_type,
+              0x00000404, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_01_RSRC_TYPE, dst_rsrc_grp_01_rsrc_type,
+              0x00000500, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_23_RSRC_TYPE, dst_rsrc_grp_23_rsrc_type,
+              0x00000504, 0x0020);
+
+IPA_REG_STRIDE(ENDP_INIT_CFG, endp_init_cfg, 0x00000808, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_NAT, endp_init_nat, 0x0000080c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR, endp_init_hdr, 0x00000810, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_EXT, endp_init_hdr_ext, 0x00000814, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_METADATA_MASK, endp_init_hdr_metadata_mask,
+              0x00000818, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_MODE, endp_init_mode, 0x00000820, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_AGGR, endp_init_aggr, 0x00000824, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_EN, endp_init_hol_block_en,
+              0x0000082c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_TIMER, endp_init_hol_block_timer,
+              0x00000830, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_DEAGGR, endp_init_deaggr, 0x00000834, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_RSRC_GRP, endp_init_rsrc_grp, 0x00000838, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_SEQ, endp_init_seq, 0x0000083c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_STATUS, endp_status, 0x00000840, 0x0070);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_STTS, ipa_irq_stts, 0x00003008 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_EN, ipa_irq_en, 0x0000300c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_CLR, ipa_irq_clr, 0x00003010 + 0x1000 * GSI_EE_AP);
+
+IPA_REG(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
+
+static const struct ipa_reg *ipa_reg_array[] = {
+       [COMP_CFG]                      = &ipa_reg_comp_cfg,
+       [CLKON_CFG]                     = &ipa_reg_clkon_cfg,
+       [ROUTE]                         = &ipa_reg_route,
+       [SHARED_MEM_SIZE]               = &ipa_reg_shared_mem_size,
+       [QSB_MAX_WRITES]                = &ipa_reg_qsb_max_writes,
+       [QSB_MAX_READS]                 = &ipa_reg_qsb_max_reads,
+       [FILT_ROUT_HASH_EN]             = &ipa_reg_filt_rout_hash_en,
+       [FILT_ROUT_HASH_FLUSH]          = &ipa_reg_filt_rout_hash_flush,
+       [STATE_AGGR_ACTIVE]             = &ipa_reg_state_aggr_active,
+       [IPA_BCR]                       = &ipa_reg_ipa_bcr,
+       [LOCAL_PKT_PROC_CNTXT]          = &ipa_reg_local_pkt_proc_cntxt,
+       [AGGR_FORCE_CLOSE]              = &ipa_reg_aggr_force_close,
+       [COUNTER_CFG]                   = &ipa_reg_counter_cfg,
+       [IPA_TX_CFG]                    = &ipa_reg_ipa_tx_cfg,
+       [FLAVOR_0]                      = &ipa_reg_flavor_0,
+       [IDLE_INDICATION_CFG]           = &ipa_reg_idle_indication_cfg,
+       [SRC_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_01_rsrc_type,
+       [SRC_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_23_rsrc_type,
+       [DST_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_01_rsrc_type,
+       [DST_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_23_rsrc_type,
+       [ENDP_INIT_CFG]                 = &ipa_reg_endp_init_cfg,
+       [ENDP_INIT_NAT]                 = &ipa_reg_endp_init_nat,
+       [ENDP_INIT_HDR]                 = &ipa_reg_endp_init_hdr,
+       [ENDP_INIT_HDR_EXT]             = &ipa_reg_endp_init_hdr_ext,
+       [ENDP_INIT_HDR_METADATA_MASK]   = &ipa_reg_endp_init_hdr_metadata_mask,
+       [ENDP_INIT_MODE]                = &ipa_reg_endp_init_mode,
+       [ENDP_INIT_AGGR]                = &ipa_reg_endp_init_aggr,
+       [ENDP_INIT_HOL_BLOCK_EN]        = &ipa_reg_endp_init_hol_block_en,
+       [ENDP_INIT_HOL_BLOCK_TIMER]     = &ipa_reg_endp_init_hol_block_timer,
+       [ENDP_INIT_DEAGGR]              = &ipa_reg_endp_init_deaggr,
+       [ENDP_INIT_RSRC_GRP]            = &ipa_reg_endp_init_rsrc_grp,
+       [ENDP_INIT_SEQ]                 = &ipa_reg_endp_init_seq,
+       [ENDP_STATUS]                   = &ipa_reg_endp_status,
+       [IPA_IRQ_STTS]                  = &ipa_reg_ipa_irq_stts,
+       [IPA_IRQ_EN]                    = &ipa_reg_ipa_irq_en,
+       [IPA_IRQ_CLR]                   = &ipa_reg_ipa_irq_clr,
+       [IPA_IRQ_UC]                    = &ipa_reg_ipa_irq_uc,
+       [IRQ_SUSPEND_INFO]              = &ipa_reg_irq_suspend_info,
+       [IRQ_SUSPEND_EN]                = &ipa_reg_irq_suspend_en,
+       [IRQ_SUSPEND_CLR]               = &ipa_reg_irq_suspend_clr,
+};
+
+const struct ipa_regs ipa_regs_v4_2 = {
+       .reg_count      = ARRAY_SIZE(ipa_reg_array),
+       .reg            = ipa_reg_array,
+};
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+/* Copyright (C) 2022 Linaro Ltd. */
+
+#include <linux/types.h>
+
+#include "../ipa.h"
+#include "../ipa_reg.h"
+
+IPA_REG(COMP_CFG, comp_cfg, 0x0000003c);
+
+IPA_REG(CLKON_CFG, clkon_cfg, 0x00000044);
+
+IPA_REG(ROUTE, route, 0x00000048);
+
+IPA_REG(SHARED_MEM_SIZE, shared_mem_size, 0x00000054);
+
+IPA_REG(QSB_MAX_WRITES, qsb_max_writes, 0x00000074);
+
+IPA_REG(QSB_MAX_READS, qsb_max_reads, 0x00000078);
+
+IPA_REG(FILT_ROUT_HASH_EN, filt_rout_hash_en, 0x0000148);
+
+IPA_REG(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
+
+/* Offset must be a multiple of 8 */
+IPA_REG(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
+
+IPA_REG(IPA_TX_CFG, ipa_tx_cfg, 0x000001fc);
+
+IPA_REG(FLAVOR_0, flavor_0, 0x00000210);
+
+IPA_REG(IDLE_INDICATION_CFG, idle_indication_cfg, 0x00000240);
+
+IPA_REG(QTIME_TIMESTAMP_CFG, qtime_timestamp_cfg, 0x0000024c);
+
+IPA_REG(TIMERS_XO_CLK_DIV_CFG, timers_xo_clk_div_cfg, 0x00000250);
+
+IPA_REG(TIMERS_PULSE_GRAN_CFG, timers_pulse_gran_cfg, 0x00000254);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_01_RSRC_TYPE, src_rsrc_grp_01_rsrc_type,
+              0x00000400, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_23_RSRC_TYPE, src_rsrc_grp_23_rsrc_type,
+              0x00000404, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_45_RSRC_TYPE, src_rsrc_grp_45_rsrc_type,
+              0x00000408, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_01_RSRC_TYPE, dst_rsrc_grp_01_rsrc_type,
+              0x00000500, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_23_RSRC_TYPE, dst_rsrc_grp_23_rsrc_type,
+              0x00000504, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_45_RSRC_TYPE, dst_rsrc_grp_45_rsrc_type,
+              0x00000508, 0x0020);
+
+IPA_REG_STRIDE(ENDP_INIT_CFG, endp_init_cfg, 0x00000808, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_NAT, endp_init_nat, 0x0000080c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR, endp_init_hdr, 0x00000810, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_EXT, endp_init_hdr_ext, 0x00000814, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_METADATA_MASK, endp_init_hdr_metadata_mask,
+              0x00000818, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_MODE, endp_init_mode, 0x00000820, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_AGGR, endp_init_aggr, 0x00000824, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_EN, endp_init_hol_block_en,
+              0x0000082c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_TIMER, endp_init_hol_block_timer,
+              0x00000830, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_DEAGGR, endp_init_deaggr, 0x00000834, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_RSRC_GRP, endp_init_rsrc_grp, 0x00000838, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_SEQ, endp_init_seq, 0x0000083c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_STATUS, endp_status, 0x00000840, 0x0070);
+
+IPA_REG_STRIDE(ENDP_FILTER_ROUTER_HSH_CFG, endp_filter_router_hsh_cfg,
+              0x0000085c, 0x0070);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_STTS, ipa_irq_stts, 0x00003008 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_EN, ipa_irq_en, 0x0000300c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_CLR, ipa_irq_clr, 0x00003010 + 0x1000 * GSI_EE_AP);
+
+IPA_REG(IPA_IRQ_UC, ipa_irq_uc, 0x0000301c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00003030 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00003034 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00003038 + 0x1000 * GSI_EE_AP);
+
+static const struct ipa_reg *ipa_reg_array[] = {
+       [COMP_CFG]                      = &ipa_reg_comp_cfg,
+       [CLKON_CFG]                     = &ipa_reg_clkon_cfg,
+       [ROUTE]                         = &ipa_reg_route,
+       [SHARED_MEM_SIZE]               = &ipa_reg_shared_mem_size,
+       [QSB_MAX_WRITES]                = &ipa_reg_qsb_max_writes,
+       [QSB_MAX_READS]                 = &ipa_reg_qsb_max_reads,
+       [FILT_ROUT_HASH_EN]             = &ipa_reg_filt_rout_hash_en,
+       [FILT_ROUT_HASH_FLUSH]          = &ipa_reg_filt_rout_hash_flush,
+       [STATE_AGGR_ACTIVE]             = &ipa_reg_state_aggr_active,
+       [LOCAL_PKT_PROC_CNTXT]          = &ipa_reg_local_pkt_proc_cntxt,
+       [AGGR_FORCE_CLOSE]              = &ipa_reg_aggr_force_close,
+       [IPA_TX_CFG]                    = &ipa_reg_ipa_tx_cfg,
+       [FLAVOR_0]                      = &ipa_reg_flavor_0,
+       [IDLE_INDICATION_CFG]           = &ipa_reg_idle_indication_cfg,
+       [QTIME_TIMESTAMP_CFG]           = &ipa_reg_qtime_timestamp_cfg,
+       [TIMERS_XO_CLK_DIV_CFG]         = &ipa_reg_timers_xo_clk_div_cfg,
+       [TIMERS_PULSE_GRAN_CFG]         = &ipa_reg_timers_pulse_gran_cfg,
+       [SRC_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_01_rsrc_type,
+       [SRC_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_23_rsrc_type,
+       [SRC_RSRC_GRP_45_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_45_rsrc_type,
+       [DST_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_01_rsrc_type,
+       [DST_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_23_rsrc_type,
+       [DST_RSRC_GRP_45_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_45_rsrc_type,
+       [ENDP_INIT_CFG]                 = &ipa_reg_endp_init_cfg,
+       [ENDP_INIT_NAT]                 = &ipa_reg_endp_init_nat,
+       [ENDP_INIT_HDR]                 = &ipa_reg_endp_init_hdr,
+       [ENDP_INIT_HDR_EXT]             = &ipa_reg_endp_init_hdr_ext,
+       [ENDP_INIT_HDR_METADATA_MASK]   = &ipa_reg_endp_init_hdr_metadata_mask,
+       [ENDP_INIT_MODE]                = &ipa_reg_endp_init_mode,
+       [ENDP_INIT_AGGR]                = &ipa_reg_endp_init_aggr,
+       [ENDP_INIT_HOL_BLOCK_EN]        = &ipa_reg_endp_init_hol_block_en,
+       [ENDP_INIT_HOL_BLOCK_TIMER]     = &ipa_reg_endp_init_hol_block_timer,
+       [ENDP_INIT_DEAGGR]              = &ipa_reg_endp_init_deaggr,
+       [ENDP_INIT_RSRC_GRP]            = &ipa_reg_endp_init_rsrc_grp,
+       [ENDP_INIT_SEQ]                 = &ipa_reg_endp_init_seq,
+       [ENDP_STATUS]                   = &ipa_reg_endp_status,
+       [ENDP_FILTER_ROUTER_HSH_CFG]    = &ipa_reg_endp_filter_router_hsh_cfg,
+       [IPA_IRQ_STTS]                  = &ipa_reg_ipa_irq_stts,
+       [IPA_IRQ_EN]                    = &ipa_reg_ipa_irq_en,
+       [IPA_IRQ_CLR]                   = &ipa_reg_ipa_irq_clr,
+       [IPA_IRQ_UC]                    = &ipa_reg_ipa_irq_uc,
+       [IRQ_SUSPEND_INFO]              = &ipa_reg_irq_suspend_info,
+       [IRQ_SUSPEND_EN]                = &ipa_reg_irq_suspend_en,
+       [IRQ_SUSPEND_CLR]               = &ipa_reg_irq_suspend_clr,
+};
+
+const struct ipa_regs ipa_regs_v4_5 = {
+       .reg_count      = ARRAY_SIZE(ipa_reg_array),
+       .reg            = ipa_reg_array,
+};
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0
+
+/* Copyright (C) 2022 Linaro Ltd. */
+
+#include <linux/types.h>
+
+#include "../ipa.h"
+#include "../ipa_reg.h"
+
+IPA_REG(COMP_CFG, comp_cfg, 0x0000003c);
+
+IPA_REG(CLKON_CFG, clkon_cfg, 0x00000044);
+
+IPA_REG(ROUTE, route, 0x00000048);
+
+IPA_REG(SHARED_MEM_SIZE, shared_mem_size, 0x00000054);
+
+IPA_REG(QSB_MAX_WRITES, qsb_max_writes, 0x00000074);
+
+IPA_REG(QSB_MAX_READS, qsb_max_reads, 0x00000078);
+
+IPA_REG(FILT_ROUT_HASH_EN, filt_rout_hash_en, 0x0000148);
+
+IPA_REG(FILT_ROUT_HASH_FLUSH, filt_rout_hash_flush, 0x000014c);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(STATE_AGGR_ACTIVE, state_aggr_active, 0x000000b4);
+
+/* Offset must be a multiple of 8 */
+IPA_REG(LOCAL_PKT_PROC_CNTXT, local_pkt_proc_cntxt, 0x000001e8);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(AGGR_FORCE_CLOSE, aggr_force_close, 0x000001ec);
+
+IPA_REG(IPA_TX_CFG, ipa_tx_cfg, 0x000001fc);
+
+IPA_REG(FLAVOR_0, flavor_0, 0x00000210);
+
+IPA_REG(IDLE_INDICATION_CFG, idle_indication_cfg, 0x00000240);
+
+IPA_REG(QTIME_TIMESTAMP_CFG, qtime_timestamp_cfg, 0x0000024c);
+
+IPA_REG(TIMERS_XO_CLK_DIV_CFG, timers_xo_clk_div_cfg, 0x00000250);
+
+IPA_REG(TIMERS_PULSE_GRAN_CFG, timers_pulse_gran_cfg, 0x00000254);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_01_RSRC_TYPE, src_rsrc_grp_01_rsrc_type,
+              0x00000400, 0x0020);
+
+IPA_REG_STRIDE(SRC_RSRC_GRP_23_RSRC_TYPE, src_rsrc_grp_23_rsrc_type,
+              0x00000404, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_01_RSRC_TYPE, dst_rsrc_grp_01_rsrc_type,
+              0x00000500, 0x0020);
+
+IPA_REG_STRIDE(DST_RSRC_GRP_23_RSRC_TYPE, dst_rsrc_grp_23_rsrc_type,
+              0x00000504, 0x0020);
+
+IPA_REG_STRIDE(ENDP_INIT_CFG, endp_init_cfg, 0x00000808, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_NAT, endp_init_nat, 0x0000080c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR, endp_init_hdr, 0x00000810, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_EXT, endp_init_hdr_ext, 0x00000814, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HDR_METADATA_MASK, endp_init_hdr_metadata_mask,
+              0x00000818, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_MODE, endp_init_mode, 0x00000820, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_AGGR, endp_init_aggr, 0x00000824, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_EN, endp_init_hol_block_en,
+              0x0000082c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_HOL_BLOCK_TIMER, endp_init_hol_block_timer,
+              0x00000830, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_DEAGGR, endp_init_deaggr, 0x00000834, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_RSRC_GRP, endp_init_rsrc_grp, 0x00000838, 0x0070);
+
+IPA_REG_STRIDE(ENDP_INIT_SEQ, endp_init_seq, 0x0000083c, 0x0070);
+
+IPA_REG_STRIDE(ENDP_STATUS, endp_status, 0x00000840, 0x0070);
+
+IPA_REG_STRIDE(ENDP_FILTER_ROUTER_HSH_CFG, endp_filter_router_hsh_cfg,
+              0x0000085c, 0x0070);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_STTS, ipa_irq_stts, 0x00004008 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_EN, ipa_irq_en, 0x0000400c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by enum ipa_irq_id; only used for GSI_EE_AP */
+IPA_REG(IPA_IRQ_CLR, ipa_irq_clr, 0x00004010 + 0x1000 * GSI_EE_AP);
+
+IPA_REG(IPA_IRQ_UC, ipa_irq_uc, 0x0000401c + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_INFO, irq_suspend_info, 0x00004030 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_EN, irq_suspend_en, 0x00004034 + 0x1000 * GSI_EE_AP);
+
+/* Valid bits defined by ipa->available */
+IPA_REG(IRQ_SUSPEND_CLR, irq_suspend_clr, 0x00004038 + 0x1000 * GSI_EE_AP);
+
+static const struct ipa_reg *ipa_reg_array[] = {
+       [COMP_CFG]                      = &ipa_reg_comp_cfg,
+       [CLKON_CFG]                     = &ipa_reg_clkon_cfg,
+       [ROUTE]                         = &ipa_reg_route,
+       [SHARED_MEM_SIZE]               = &ipa_reg_shared_mem_size,
+       [QSB_MAX_WRITES]                = &ipa_reg_qsb_max_writes,
+       [QSB_MAX_READS]                 = &ipa_reg_qsb_max_reads,
+       [FILT_ROUT_HASH_EN]             = &ipa_reg_filt_rout_hash_en,
+       [FILT_ROUT_HASH_FLUSH]          = &ipa_reg_filt_rout_hash_flush,
+       [STATE_AGGR_ACTIVE]             = &ipa_reg_state_aggr_active,
+       [LOCAL_PKT_PROC_CNTXT]          = &ipa_reg_local_pkt_proc_cntxt,
+       [AGGR_FORCE_CLOSE]              = &ipa_reg_aggr_force_close,
+       [IPA_TX_CFG]                    = &ipa_reg_ipa_tx_cfg,
+       [FLAVOR_0]                      = &ipa_reg_flavor_0,
+       [IDLE_INDICATION_CFG]           = &ipa_reg_idle_indication_cfg,
+       [QTIME_TIMESTAMP_CFG]           = &ipa_reg_qtime_timestamp_cfg,
+       [TIMERS_XO_CLK_DIV_CFG]         = &ipa_reg_timers_xo_clk_div_cfg,
+       [TIMERS_PULSE_GRAN_CFG]         = &ipa_reg_timers_pulse_gran_cfg,
+       [SRC_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_01_rsrc_type,
+       [SRC_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_src_rsrc_grp_23_rsrc_type,
+       [DST_RSRC_GRP_01_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_01_rsrc_type,
+       [DST_RSRC_GRP_23_RSRC_TYPE]     = &ipa_reg_dst_rsrc_grp_23_rsrc_type,
+       [ENDP_INIT_CFG]                 = &ipa_reg_endp_init_cfg,
+       [ENDP_INIT_NAT]                 = &ipa_reg_endp_init_nat,
+       [ENDP_INIT_HDR]                 = &ipa_reg_endp_init_hdr,
+       [ENDP_INIT_HDR_EXT]             = &ipa_reg_endp_init_hdr_ext,
+       [ENDP_INIT_HDR_METADATA_MASK]   = &ipa_reg_endp_init_hdr_metadata_mask,
+       [ENDP_INIT_MODE]                = &ipa_reg_endp_init_mode,
+       [ENDP_INIT_AGGR]                = &ipa_reg_endp_init_aggr,
+       [ENDP_INIT_HOL_BLOCK_EN]        = &ipa_reg_endp_init_hol_block_en,
+       [ENDP_INIT_HOL_BLOCK_TIMER]     = &ipa_reg_endp_init_hol_block_timer,
+       [ENDP_INIT_DEAGGR]              = &ipa_reg_endp_init_deaggr,
+       [ENDP_INIT_RSRC_GRP]            = &ipa_reg_endp_init_rsrc_grp,
+       [ENDP_INIT_SEQ]                 = &ipa_reg_endp_init_seq,
+       [ENDP_STATUS]                   = &ipa_reg_endp_status,
+       [ENDP_FILTER_ROUTER_HSH_CFG]    = &ipa_reg_endp_filter_router_hsh_cfg,
+       [IPA_IRQ_STTS]                  = &ipa_reg_ipa_irq_stts,
+       [IPA_IRQ_EN]                    = &ipa_reg_ipa_irq_en,
+       [IPA_IRQ_CLR]                   = &ipa_reg_ipa_irq_clr,
+       [IPA_IRQ_UC]                    = &ipa_reg_ipa_irq_uc,
+       [IRQ_SUSPEND_INFO]              = &ipa_reg_irq_suspend_info,
+       [IRQ_SUSPEND_EN]                = &ipa_reg_irq_suspend_en,
+       [IRQ_SUSPEND_CLR]               = &ipa_reg_irq_suspend_clr,
+};
+
+const struct ipa_regs ipa_regs_v4_9 = {
+       .reg_count      = ARRAY_SIZE(ipa_reg_array),
+       .reg            = ipa_reg_array,
+};