net: ipa: support more than 6 resource groups
authorAlex Elder <elder@linaro.org>
Fri, 26 Mar 2021 15:11:22 +0000 (10:11 -0500)
committerDavid S. Miller <davem@davemloft.net>
Fri, 26 Mar 2021 22:02:39 +0000 (15:02 -0700)
IPA versions 3.0 and 3.1 support up to 8 resource groups.  There is
some interest in supporting these older versions of the hardware, so
update the resource configuration code to program resource limits
for these groups if specified.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ipa/ipa_data.h
drivers/net/ipa/ipa_reg.h
drivers/net/ipa/ipa_resource.c

index c5d763a..ea8f992 100644 (file)
@@ -46,8 +46,8 @@
  * the IPA endpoint.
  */
 
-/* The maximum value returned by ipa_resource_group_{src,dst}_count() */
-#define IPA_RESOURCE_GROUP_MAX 5
+/* The maximum possible number of source or destination resource groups */
+#define IPA_RESOURCE_GROUP_MAX 8
 
 /** enum ipa_qsb_master_id - array index for IPA QSB configuration data */
 enum ipa_qsb_master_id {
index 9c798ce..de2a944 100644 (file)
@@ -353,12 +353,16 @@ enum ipa_pulse_gran {
                                        (0x00000404 + 0x0020 * (rt))
 #define IPA_REG_SRC_RSRC_GRP_45_RSRC_TYPE_N_OFFSET(rt) \
                                        (0x00000408 + 0x0020 * (rt))
+#define IPA_REG_SRC_RSRC_GRP_67_RSRC_TYPE_N_OFFSET(rt) \
+                                       (0x0000040c + 0x0020 * (rt))
 #define IPA_REG_DST_RSRC_GRP_01_RSRC_TYPE_N_OFFSET(rt) \
                                        (0x00000500 + 0x0020 * (rt))
 #define IPA_REG_DST_RSRC_GRP_23_RSRC_TYPE_N_OFFSET(rt) \
                                        (0x00000504 + 0x0020 * (rt))
 #define IPA_REG_DST_RSRC_GRP_45_RSRC_TYPE_N_OFFSET(rt) \
                                        (0x00000508 + 0x0020 * (rt))
+#define IPA_REG_DST_RSRC_GRP_67_RSRC_TYPE_N_OFFSET(rt) \
+                                       (0x0000050c + 0x0020 * (rt))
 /* The next four fields are used for all resource group registers */
 #define X_MIN_LIM_FMASK                                GENMASK(5, 0)
 #define X_MAX_LIM_FMASK                                GENMASK(13, 8)
index 578ff07..85f922d 100644 (file)
@@ -34,8 +34,8 @@ static bool ipa_resource_limits_valid(struct ipa *ipa,
        u32 i;
        u32 j;
 
-       /* We program at most 6 source or destination resource group limits */
-       BUILD_BUG_ON(IPA_RESOURCE_GROUP_MAX > 6);
+       /* We program at most 8 source or destination resource group limits */
+       BUILD_BUG_ON(IPA_RESOURCE_GROUP_MAX > 8);
 
        group_count = data->rsrc_group_src_count;
        if (!group_count || group_count > IPA_RESOURCE_GROUP_MAX)
@@ -113,6 +113,13 @@ static void ipa_resource_config_src(struct ipa *ipa, u32 resource_type,
        offset = IPA_REG_SRC_RSRC_GRP_45_RSRC_TYPE_N_OFFSET(resource_type);
        ylimits = group_count == 5 ? NULL : &resource->limits[5];
        ipa_resource_config_common(ipa, offset, &resource->limits[4], ylimits);
+
+       if (group_count < 7)
+               return;
+
+       offset = IPA_REG_SRC_RSRC_GRP_67_RSRC_TYPE_N_OFFSET(resource_type);
+       ylimits = group_count == 7 ? NULL : &resource->limits[7];
+       ipa_resource_config_common(ipa, offset, &resource->limits[6], ylimits);
 }
 
 static void ipa_resource_config_dst(struct ipa *ipa, u32 resource_type,
@@ -142,6 +149,13 @@ static void ipa_resource_config_dst(struct ipa *ipa, u32 resource_type,
        offset = IPA_REG_DST_RSRC_GRP_45_RSRC_TYPE_N_OFFSET(resource_type);
        ylimits = group_count == 5 ? NULL : &resource->limits[5];
        ipa_resource_config_common(ipa, offset, &resource->limits[4], ylimits);
+
+       if (group_count < 7)
+               return;
+
+       offset = IPA_REG_DST_RSRC_GRP_67_RSRC_TYPE_N_OFFSET(resource_type);
+       ylimits = group_count == 7 ? NULL : &resource->limits[7];
+       ipa_resource_config_common(ipa, offset, &resource->limits[6], ylimits);
 }
 
 /* Configure resources */