diff options
Diffstat (limited to 'drivers/infiniband/hw/ehca/ehca_main.c')
-rw-r--r-- | drivers/infiniband/hw/ehca/ehca_main.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index 65048976198c..482103eb6eac 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
@@ -68,6 +68,8 @@ int ehca_port_act_time = 30; | |||
68 | int ehca_static_rate = -1; | 68 | int ehca_static_rate = -1; |
69 | int ehca_scaling_code = 0; | 69 | int ehca_scaling_code = 0; |
70 | int ehca_lock_hcalls = -1; | 70 | int ehca_lock_hcalls = -1; |
71 | int ehca_max_cq = -1; | ||
72 | int ehca_max_qp = -1; | ||
71 | 73 | ||
72 | module_param_named(open_aqp1, ehca_open_aqp1, bool, S_IRUGO); | 74 | module_param_named(open_aqp1, ehca_open_aqp1, bool, S_IRUGO); |
73 | module_param_named(debug_level, ehca_debug_level, int, S_IRUGO); | 75 | module_param_named(debug_level, ehca_debug_level, int, S_IRUGO); |
@@ -79,6 +81,8 @@ module_param_named(poll_all_eqs, ehca_poll_all_eqs, bool, S_IRUGO); | |||
79 | module_param_named(static_rate, ehca_static_rate, int, S_IRUGO); | 81 | module_param_named(static_rate, ehca_static_rate, int, S_IRUGO); |
80 | module_param_named(scaling_code, ehca_scaling_code, bool, S_IRUGO); | 82 | module_param_named(scaling_code, ehca_scaling_code, bool, S_IRUGO); |
81 | module_param_named(lock_hcalls, ehca_lock_hcalls, bool, S_IRUGO); | 83 | module_param_named(lock_hcalls, ehca_lock_hcalls, bool, S_IRUGO); |
84 | module_param_named(number_of_cqs, ehca_max_cq, int, S_IRUGO); | ||
85 | module_param_named(number_of_qps, ehca_max_qp, int, S_IRUGO); | ||
82 | 86 | ||
83 | MODULE_PARM_DESC(open_aqp1, | 87 | MODULE_PARM_DESC(open_aqp1, |
84 | "Open AQP1 on startup (default: no)"); | 88 | "Open AQP1 on startup (default: no)"); |
@@ -104,6 +108,12 @@ MODULE_PARM_DESC(scaling_code, | |||
104 | MODULE_PARM_DESC(lock_hcalls, | 108 | MODULE_PARM_DESC(lock_hcalls, |
105 | "Serialize all hCalls made by the driver " | 109 | "Serialize all hCalls made by the driver " |
106 | "(default: autodetect)"); | 110 | "(default: autodetect)"); |
111 | MODULE_PARM_DESC(number_of_cqs, | ||
112 | "Max number of CQs which can be allocated " | ||
113 | "(default: autodetect)"); | ||
114 | MODULE_PARM_DESC(number_of_qps, | ||
115 | "Max number of QPs which can be allocated " | ||
116 | "(default: autodetect)"); | ||
107 | 117 | ||
108 | DEFINE_RWLOCK(ehca_qp_idr_lock); | 118 | DEFINE_RWLOCK(ehca_qp_idr_lock); |
109 | DEFINE_RWLOCK(ehca_cq_idr_lock); | 119 | DEFINE_RWLOCK(ehca_cq_idr_lock); |
@@ -355,6 +365,25 @@ static int ehca_sense_attributes(struct ehca_shca *shca) | |||
355 | if (rblock->memory_page_size_supported & pgsize_map[i]) | 365 | if (rblock->memory_page_size_supported & pgsize_map[i]) |
356 | shca->hca_cap_mr_pgsize |= pgsize_map[i + 1]; | 366 | shca->hca_cap_mr_pgsize |= pgsize_map[i + 1]; |
357 | 367 | ||
368 | /* Set maximum number of CQs and QPs to calculate EQ size */ | ||
369 | if (ehca_max_qp == -1) | ||
370 | ehca_max_qp = min_t(int, rblock->max_qp, EHCA_MAX_NUM_QUEUES); | ||
371 | else if (ehca_max_qp < 1 || ehca_max_qp > rblock->max_qp) { | ||
372 | ehca_gen_err("Requested number of QPs is out of range (1 - %i) " | ||
373 | "specified by HW", rblock->max_qp); | ||
374 | ret = -EINVAL; | ||
375 | goto sense_attributes1; | ||
376 | } | ||
377 | |||
378 | if (ehca_max_cq == -1) | ||
379 | ehca_max_cq = min_t(int, rblock->max_cq, EHCA_MAX_NUM_QUEUES); | ||
380 | else if (ehca_max_cq < 1 || ehca_max_cq > rblock->max_cq) { | ||
381 | ehca_gen_err("Requested number of CQs is out of range (1 - %i) " | ||
382 | "specified by HW", rblock->max_cq); | ||
383 | ret = -EINVAL; | ||
384 | goto sense_attributes1; | ||
385 | } | ||
386 | |||
358 | /* query max MTU from first port -- it's the same for all ports */ | 387 | /* query max MTU from first port -- it's the same for all ports */ |
359 | port = (struct hipz_query_port *)rblock; | 388 | port = (struct hipz_query_port *)rblock; |
360 | h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port); | 389 | h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port); |
@@ -684,7 +713,7 @@ static int __devinit ehca_probe(struct of_device *dev, | |||
684 | struct ehca_shca *shca; | 713 | struct ehca_shca *shca; |
685 | const u64 *handle; | 714 | const u64 *handle; |
686 | struct ib_pd *ibpd; | 715 | struct ib_pd *ibpd; |
687 | int ret, i; | 716 | int ret, i, eq_size; |
688 | 717 | ||
689 | handle = of_get_property(dev->node, "ibm,hca-handle", NULL); | 718 | handle = of_get_property(dev->node, "ibm,hca-handle", NULL); |
690 | if (!handle) { | 719 | if (!handle) { |
@@ -705,6 +734,8 @@ static int __devinit ehca_probe(struct of_device *dev, | |||
705 | return -ENOMEM; | 734 | return -ENOMEM; |
706 | } | 735 | } |
707 | mutex_init(&shca->modify_mutex); | 736 | mutex_init(&shca->modify_mutex); |
737 | atomic_set(&shca->num_cqs, 0); | ||
738 | atomic_set(&shca->num_qps, 0); | ||
708 | for (i = 0; i < ARRAY_SIZE(shca->sport); i++) | 739 | for (i = 0; i < ARRAY_SIZE(shca->sport); i++) |
709 | spin_lock_init(&shca->sport[i].mod_sqp_lock); | 740 | spin_lock_init(&shca->sport[i].mod_sqp_lock); |
710 | 741 | ||
@@ -724,8 +755,9 @@ static int __devinit ehca_probe(struct of_device *dev, | |||
724 | goto probe1; | 755 | goto probe1; |
725 | } | 756 | } |
726 | 757 | ||
758 | eq_size = 2 * ehca_max_cq + 4 * ehca_max_qp; | ||
727 | /* create event queues */ | 759 | /* create event queues */ |
728 | ret = ehca_create_eq(shca, &shca->eq, EHCA_EQ, 2048); | 760 | ret = ehca_create_eq(shca, &shca->eq, EHCA_EQ, eq_size); |
729 | if (ret) { | 761 | if (ret) { |
730 | ehca_err(&shca->ib_device, "Cannot create EQ."); | 762 | ehca_err(&shca->ib_device, "Cannot create EQ."); |
731 | goto probe1; | 763 | goto probe1; |