[openib-general] [PATCH v2] IB_mthca HCA profile module parameters

Moni Shoua monis at voltaire.com
Tue Nov 21 09:26:04 PST 2006


From: Leonid Arsh Mleonida at voltaire.com>

Adds module parameters that enable settting some of the HCA
profile values
Signed-off-by: Leonid Arsh <leonida at voltaire.com>
Signed-off-by: Moni Shoua <monis at voltaire.com>
---
 mthca_main.c |  115 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 104 insertions(+), 11 deletions(-)
--- a/drivers/infiniband/hw/mthca/mthca_main.c
+++ b/drivers/infiniband/hw/mthca/mthca_main.c
@@ -80,21 +80,110 @@ static int tune_pci = 0;
 module_param(tune_pci, int, 0444);
 MODULE_PARM_DESC(tune_pci, "increase PCI burst from the default set by BIOS if nonzero");
 
+#define MTHCA_DEFAULT_NUM_QP            (1 << 16)
+#define MTHCA_DEFAULT_RDB_PER_QP        (1 << 2)
+#define MTHCA_DEFAULT_NUM_CQ            (1 << 16)
+#define MTHCA_DEFAULT_NUM_MCG           (1 << 13)
+#define MTHCA_DEFAULT_NUM_MPT           (1 << 17)
+#define MTHCA_DEFAULT_NUM_MTT           (1 << 20)
+#define MTHCA_DEFAULT_NUM_UDAV          (1 << 15)
+#define MTHCA_DEFAULT_NUM_RESERVED_MTTS (1 << 18)
+#define MTHCA_DEFAULT_NUM_UARC_SIZE     (1 << 18)
+
+static struct mthca_profile default_profile = {
+	.num_qp             = MTHCA_DEFAULT_NUM_QP,
+	.rdb_per_qp         = MTHCA_DEFAULT_RDB_PER_QP,
+	.num_cq             = MTHCA_DEFAULT_NUM_CQ,
+	.num_mcg            = MTHCA_DEFAULT_NUM_MCG,
+	.num_mpt            = MTHCA_DEFAULT_NUM_MPT,
+	.num_mtt            = MTHCA_DEFAULT_NUM_MTT,
+	.num_udav           = MTHCA_DEFAULT_NUM_UDAV,          /* Tavor only */
+	.fmr_reserved_mtts  = MTHCA_DEFAULT_NUM_RESERVED_MTTS, /* Tavor only */
+	.uarc_size          = MTHCA_DEFAULT_NUM_UARC_SIZE,     /* Arbel only */
+};
+
+module_param_named(num_qp, default_profile.num_qp, int, 0444);
+MODULE_PARM_DESC(num_qp, "maximum number of available QPs per HCA");
+
+module_param_named(rdb_per_qp, default_profile.rdb_per_qp, int, 0444);
+MODULE_PARM_DESC(rdb_per_qp, "number of RDB buffers per QP");
+
+module_param_named(num_cq, default_profile.num_cq, int, 0444);
+MODULE_PARM_DESC(num_cq, "maximum number of CQs per HCA");
+
+module_param_named(num_mcg, default_profile.num_mcg, int, 0444);
+MODULE_PARM_DESC(num_mcg, "maximum number of multicast groups per HCA");
+
+module_param_named(num_mpt, default_profile.num_mpt, int, 0444);
+MODULE_PARM_DESC(num_mpt, 
+		"maximum number of memory protection pable entries per HCA");
+
+module_param_named(num_mtt, default_profile.num_mtt, int, 0444);
+MODULE_PARM_DESC(num_mtt,
+		 "maximum number of memory translation table segments per HCA");
+/* Tavor only */
+module_param_named(num_udav, default_profile.num_udav, int, 0444);
+MODULE_PARM_DESC(num_udav, "maximum number of UD address vectors per HCA");
+
+/* Tavor only */
+module_param_named(fmr_reserved_mtts, default_profile.fmr_reserved_mtts, int, 0444);
+MODULE_PARM_DESC(fmr_reserved_mtts,
+		 "number of memory translation table segments reserved for FMR");
+
 static const char mthca_version[] __devinitdata =
 	DRV_NAME ": Mellanox InfiniBand HCA driver v"
 	DRV_VERSION " (" DRV_RELDATE ")\n";
 
-static struct mthca_profile default_profile = {
-	.num_qp		   = 1 << 16,
-	.rdb_per_qp	   = 4,
-	.num_cq		   = 1 << 16,
-	.num_mcg	   = 1 << 13,
-	.num_mpt	   = 1 << 17,
-	.num_mtt	   = 1 << 20,
-	.num_udav	   = 1 << 15,	/* Tavor only */
-	.fmr_reserved_mtts = 1 << 18,	/* Tavor only */
-	.uarc_size	   = 1 << 18,	/* Arbel only */
-};
+
+static int __devinit mthca_check_profile_value(int* pval,int pval_default){
+	/* value must be positive and power of 2 */
+	int old_pval = *pval;
+
+	if (old_pval <= 0)
+		*pval = pval_default;
+	else
+		*pval = roundup_pow_of_two(old_pval);
+
+	return old_pval-*pval;
+}
+
+#define mthca_check_profile_and_warn(name,var,defval) \
+	if (mthca_check_profile_value(&var,defval)) \
+		mthca_warn(mdev,"invalid %s passed. changed to %d.\n",#name,var); 
+
+static int __devinit mthca_validate_profile(struct mthca_dev *mdev,
+                                            struct mthca_profile *profile)
+{
+
+	mthca_check_profile_and_warn(num_qp,default_profile.num_qp,
+						 MTHCA_DEFAULT_NUM_QP);
+	mthca_check_profile_and_warn(rdb_per_qp,default_profile.rdb_per_qp,
+						 MTHCA_DEFAULT_RDB_PER_QP);
+	mthca_check_profile_and_warn(num_cq,default_profile.num_cq,
+						 MTHCA_DEFAULT_NUM_CQ);
+	mthca_check_profile_and_warn(num_mcg,default_profile.num_mcg,
+						 MTHCA_DEFAULT_NUM_MCG);
+	mthca_check_profile_and_warn(num_mpt,default_profile.num_mpt,
+						 MTHCA_DEFAULT_NUM_MPT);
+	mthca_check_profile_and_warn(num_mtt,default_profile.num_mtt,
+						 MTHCA_DEFAULT_NUM_MTT);
+
+	if (mthca_is_memfree(mdev)) {
+		mthca_check_profile_and_warn(num_udav,default_profile.num_udav,
+							 MTHCA_DEFAULT_NUM_UDAV);
+		mthca_check_profile_and_warn(fmr_reserved_mtts,default_profile.fmr_reserved_mtts,
+							 MTHCA_DEFAULT_NUM_RESERVED_MTTS);
+
+		if (default_profile.fmr_reserved_mtts >= default_profile.num_mtt ) {
+			mthca_err(mdev,"Invalid fmr_reserved_mtts parameter" 
+					  "value (%d). Must be lower then num_mtt (%d)\n",
+					  default_profile.fmr_reserved_mtts,
+					  default_profile.num_mtt ); 
+			return -EINVAL;
+		}
+	}
+	return 0;
+}
 
 static int __devinit mthca_tune_pci(struct mthca_dev *mdev)
 {
@@ -1095,6 +1184,10 @@ static int __devinit mthca_init_one(stru
 	if (err)
 		goto err_cmd;
 
+	err = mthca_validate_profile(mdev, &default_profile);
+	if (err)
+		goto err_cmd;
+
 	err = mthca_init_hca(mdev);
 	if (err)
 		goto err_cmd;





More information about the general mailing list