diff options
Diffstat (limited to 'drivers/infiniband/hw/ehca/ehca_main.c')
-rw-r--r-- | drivers/infiniband/hw/ehca/ehca_main.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c index 04c324330b7c..99036b65bb84 100644 --- a/drivers/infiniband/hw/ehca/ehca_main.c +++ b/drivers/infiniband/hw/ehca/ehca_main.c | |||
@@ -63,6 +63,7 @@ int ehca_port_act_time = 30; | |||
63 | int ehca_poll_all_eqs = 1; | 63 | int ehca_poll_all_eqs = 1; |
64 | int ehca_static_rate = -1; | 64 | int ehca_static_rate = -1; |
65 | int ehca_scaling_code = 0; | 65 | int ehca_scaling_code = 0; |
66 | int ehca_mr_largepage = 0; | ||
66 | 67 | ||
67 | module_param_named(open_aqp1, ehca_open_aqp1, int, 0); | 68 | module_param_named(open_aqp1, ehca_open_aqp1, int, 0); |
68 | module_param_named(debug_level, ehca_debug_level, int, 0); | 69 | module_param_named(debug_level, ehca_debug_level, int, 0); |
@@ -72,7 +73,8 @@ module_param_named(use_hp_mr, ehca_use_hp_mr, int, 0); | |||
72 | module_param_named(port_act_time, ehca_port_act_time, int, 0); | 73 | module_param_named(port_act_time, ehca_port_act_time, int, 0); |
73 | module_param_named(poll_all_eqs, ehca_poll_all_eqs, int, 0); | 74 | module_param_named(poll_all_eqs, ehca_poll_all_eqs, int, 0); |
74 | module_param_named(static_rate, ehca_static_rate, int, 0); | 75 | module_param_named(static_rate, ehca_static_rate, int, 0); |
75 | module_param_named(scaling_code, ehca_scaling_code, int, 0); | 76 | module_param_named(scaling_code, ehca_scaling_code, int, 0); |
77 | module_param_named(mr_largepage, ehca_mr_largepage, int, 0); | ||
76 | 78 | ||
77 | MODULE_PARM_DESC(open_aqp1, | 79 | MODULE_PARM_DESC(open_aqp1, |
78 | "AQP1 on startup (0: no (default), 1: yes)"); | 80 | "AQP1 on startup (0: no (default), 1: yes)"); |
@@ -95,6 +97,9 @@ MODULE_PARM_DESC(static_rate, | |||
95 | "set permanent static rate (default: disabled)"); | 97 | "set permanent static rate (default: disabled)"); |
96 | MODULE_PARM_DESC(scaling_code, | 98 | MODULE_PARM_DESC(scaling_code, |
97 | "set scaling code (0: disabled/default, 1: enabled)"); | 99 | "set scaling code (0: disabled/default, 1: enabled)"); |
100 | MODULE_PARM_DESC(mr_largepage, | ||
101 | "use large page for MR (0: use PAGE_SIZE (default), " | ||
102 | "1: use large page depending on MR size"); | ||
98 | 103 | ||
99 | DEFINE_RWLOCK(ehca_qp_idr_lock); | 104 | DEFINE_RWLOCK(ehca_qp_idr_lock); |
100 | DEFINE_RWLOCK(ehca_cq_idr_lock); | 105 | DEFINE_RWLOCK(ehca_cq_idr_lock); |
@@ -125,6 +130,23 @@ void ehca_free_fw_ctrlblock(void *ptr) | |||
125 | } | 130 | } |
126 | #endif | 131 | #endif |
127 | 132 | ||
133 | int ehca2ib_return_code(u64 ehca_rc) | ||
134 | { | ||
135 | switch (ehca_rc) { | ||
136 | case H_SUCCESS: | ||
137 | return 0; | ||
138 | case H_RESOURCE: /* Resource in use */ | ||
139 | case H_BUSY: | ||
140 | return -EBUSY; | ||
141 | case H_NOT_ENOUGH_RESOURCES: /* insufficient resources */ | ||
142 | case H_CONSTRAINED: /* resource constraint */ | ||
143 | case H_NO_MEM: | ||
144 | return -ENOMEM; | ||
145 | default: | ||
146 | return -EINVAL; | ||
147 | } | ||
148 | } | ||
149 | |||
128 | static int ehca_create_slab_caches(void) | 150 | static int ehca_create_slab_caches(void) |
129 | { | 151 | { |
130 | int ret; | 152 | int ret; |
@@ -159,6 +181,12 @@ static int ehca_create_slab_caches(void) | |||
159 | goto create_slab_caches5; | 181 | goto create_slab_caches5; |
160 | } | 182 | } |
161 | 183 | ||
184 | ret = ehca_init_small_qp_cache(); | ||
185 | if (ret) { | ||
186 | ehca_gen_err("Cannot create small queue SLAB cache."); | ||
187 | goto create_slab_caches6; | ||
188 | } | ||
189 | |||
162 | #ifdef CONFIG_PPC_64K_PAGES | 190 | #ifdef CONFIG_PPC_64K_PAGES |
163 | ctblk_cache = kmem_cache_create("ehca_cache_ctblk", | 191 | ctblk_cache = kmem_cache_create("ehca_cache_ctblk", |
164 | EHCA_PAGESIZE, H_CB_ALIGNMENT, | 192 | EHCA_PAGESIZE, H_CB_ALIGNMENT, |
@@ -166,12 +194,15 @@ static int ehca_create_slab_caches(void) | |||
166 | NULL); | 194 | NULL); |
167 | if (!ctblk_cache) { | 195 | if (!ctblk_cache) { |
168 | ehca_gen_err("Cannot create ctblk SLAB cache."); | 196 | ehca_gen_err("Cannot create ctblk SLAB cache."); |
169 | ehca_cleanup_mrmw_cache(); | 197 | ehca_cleanup_small_qp_cache(); |
170 | goto create_slab_caches5; | 198 | goto create_slab_caches6; |
171 | } | 199 | } |
172 | #endif | 200 | #endif |
173 | return 0; | 201 | return 0; |
174 | 202 | ||
203 | create_slab_caches6: | ||
204 | ehca_cleanup_mrmw_cache(); | ||
205 | |||
175 | create_slab_caches5: | 206 | create_slab_caches5: |
176 | ehca_cleanup_av_cache(); | 207 | ehca_cleanup_av_cache(); |
177 | 208 | ||
@@ -189,6 +220,7 @@ create_slab_caches2: | |||
189 | 220 | ||
190 | static void ehca_destroy_slab_caches(void) | 221 | static void ehca_destroy_slab_caches(void) |
191 | { | 222 | { |
223 | ehca_cleanup_small_qp_cache(); | ||
192 | ehca_cleanup_mrmw_cache(); | 224 | ehca_cleanup_mrmw_cache(); |
193 | ehca_cleanup_av_cache(); | 225 | ehca_cleanup_av_cache(); |
194 | ehca_cleanup_qp_cache(); | 226 | ehca_cleanup_qp_cache(); |
@@ -295,6 +327,8 @@ int ehca_sense_attributes(struct ehca_shca *shca) | |||
295 | if (EHCA_BMASK_GET(hca_cap_descr[i].mask, shca->hca_cap)) | 327 | if (EHCA_BMASK_GET(hca_cap_descr[i].mask, shca->hca_cap)) |
296 | ehca_gen_dbg(" %s", hca_cap_descr[i].descr); | 328 | ehca_gen_dbg(" %s", hca_cap_descr[i].descr); |
297 | 329 | ||
330 | shca->hca_cap_mr_pgsize = rblock->memory_page_size_supported; | ||
331 | |||
298 | port = (struct hipz_query_port *)rblock; | 332 | port = (struct hipz_query_port *)rblock; |
299 | h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port); | 333 | h_ret = hipz_h_query_port(shca->ipz_hca_handle, 1, port); |
300 | if (h_ret != H_SUCCESS) { | 334 | if (h_ret != H_SUCCESS) { |
@@ -590,6 +624,14 @@ static ssize_t ehca_show_adapter_handle(struct device *dev, | |||
590 | } | 624 | } |
591 | static DEVICE_ATTR(adapter_handle, S_IRUGO, ehca_show_adapter_handle, NULL); | 625 | static DEVICE_ATTR(adapter_handle, S_IRUGO, ehca_show_adapter_handle, NULL); |
592 | 626 | ||
627 | static ssize_t ehca_show_mr_largepage(struct device *dev, | ||
628 | struct device_attribute *attr, | ||
629 | char *buf) | ||
630 | { | ||
631 | return sprintf(buf, "%d\n", ehca_mr_largepage); | ||
632 | } | ||
633 | static DEVICE_ATTR(mr_largepage, S_IRUGO, ehca_show_mr_largepage, NULL); | ||
634 | |||
593 | static struct attribute *ehca_dev_attrs[] = { | 635 | static struct attribute *ehca_dev_attrs[] = { |
594 | &dev_attr_adapter_handle.attr, | 636 | &dev_attr_adapter_handle.attr, |
595 | &dev_attr_num_ports.attr, | 637 | &dev_attr_num_ports.attr, |
@@ -606,6 +648,7 @@ static struct attribute *ehca_dev_attrs[] = { | |||
606 | &dev_attr_cur_mw.attr, | 648 | &dev_attr_cur_mw.attr, |
607 | &dev_attr_max_pd.attr, | 649 | &dev_attr_max_pd.attr, |
608 | &dev_attr_max_ah.attr, | 650 | &dev_attr_max_ah.attr, |
651 | &dev_attr_mr_largepage.attr, | ||
609 | NULL | 652 | NULL |
610 | }; | 653 | }; |
611 | 654 | ||