* the IPA endpoint.
  */
 
-/* The maximum value returned by ipa_resource_group_count() */
-#define IPA_RESOURCE_GROUP_COUNT       4
+/* The maximum value returned by ipa_resource_group_{src,dst}_count() */
+#define IPA_RESOURCE_GROUP_SRC_MAX     4
+#define IPA_RESOURCE_GROUP_DST_MAX     4
 
-/** enum ipa_resource_type_src - source resource types */
 /**
  * struct gsi_channel_data - GSI channel configuration data
  * @tre_count:         number of TREs in the channel ring
  */
 struct ipa_resource_src {
        enum ipa_resource_type_src type;
-       struct ipa_resource_limits limits[IPA_RESOURCE_GROUP_COUNT];
+       struct ipa_resource_limits limits[IPA_RESOURCE_GROUP_SRC_MAX];
 };
 
 /**
  */
 struct ipa_resource_dst {
        enum ipa_resource_type_dst type;
-       struct ipa_resource_limits limits[IPA_RESOURCE_GROUP_COUNT];
+       struct ipa_resource_limits limits[IPA_RESOURCE_GROUP_DST_MAX];
 };
 
 /**
 
 
 #ifdef IPA_VALIDATION
 
-/* # IPA resources used based on version (see IPA_RESOURCE_GROUP_COUNT) */
-static int ipa_resource_group_count(struct ipa *ipa)
-{
-       switch (ipa->version) {
-       case IPA_VERSION_3_5_1:
-               return 3;
-
-       case IPA_VERSION_4_0:
-       case IPA_VERSION_4_1:
-               return 4;
-
-       case IPA_VERSION_4_2:
-               return 1;
-
-       default:
-               return 0;
-       }
-}
-
 static bool ipa_resource_limits_valid(struct ipa *ipa,
                                      const struct ipa_resource_data *data)
 {
-       u32 group_count = ipa_resource_group_count(ipa);
+       u32 group_count;
        u32 i;
        u32 j;
 
+       group_count = ipa_resource_group_src_count(ipa->version);
        if (!group_count)
                return false;
 
-       /* Return an error if a non-zero resource group limit is specified
-        * for a resource not supported by hardware.
+       /* Return an error if a non-zero resource limit is specified
+        * for a resource group not supported by hardware.
         */
        for (i = 0; i < data->resource_src_count; i++) {
                const struct ipa_resource_src *resource;
 
                resource = &data->resource_src[i];
-               for (j = group_count; j < IPA_RESOURCE_GROUP_COUNT; j++)
+               for (j = group_count; j < IPA_RESOURCE_GROUP_SRC_MAX; j++)
                        if (resource->limits[j].min || resource->limits[j].max)
                                return false;
        }
 
+       group_count = ipa_resource_group_dst_count(ipa->version);
+       if (!group_count)
+               return false;
+
        for (i = 0; i < data->resource_dst_count; i++) {
                const struct ipa_resource_dst *resource;
 
                resource = &data->resource_dst[i];
-               for (j = group_count; j < IPA_RESOURCE_GROUP_COUNT; j++)
+               for (j = group_count; j < IPA_RESOURCE_GROUP_DST_MAX; j++)
                        if (resource->limits[j].min || resource->limits[j].max)
                                return false;
        }
 
 #define ENTER_IDLE_DEBOUNCE_THRESH_FMASK       GENMASK(15, 0)
 #define CONST_NON_IDLE_ENABLE_FMASK            GENMASK(16, 16)
 
+/* # IPA source resource groups available based on version */
+static inline u32 ipa_resource_group_src_count(enum ipa_version version)
+{
+       switch (version) {
+       case IPA_VERSION_3_5_1:
+       case IPA_VERSION_4_0:
+       case IPA_VERSION_4_1:
+               return 4;
+
+       case IPA_VERSION_4_2:
+               return 1;
+
+       default:
+               return 0;
+       }
+}
+
+/* # IPA destination resource groups available based on version */
+static inline u32 ipa_resource_group_dst_count(enum ipa_version version)
+{
+       switch (version) {
+       case IPA_VERSION_3_5_1:
+               return 3;
+
+       case IPA_VERSION_4_0:
+       case IPA_VERSION_4_1:
+               return 4;
+
+       case IPA_VERSION_4_2:
+               return 1;
+
+       default:
+               return 0;
+       }
+}
+
+/* Not all of the following are valid (depends on the count, above) */
 #define IPA_REG_SRC_RSRC_GRP_01_RSRC_TYPE_N_OFFSET(rt) \
                                        (0x00000400 + 0x0020 * (rt))
 #define IPA_REG_SRC_RSRC_GRP_23_RSRC_TYPE_N_OFFSET(rt) \