aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/hw/mthca/mthca_mr.c
diff options
context:
space:
mode:
authorRoland Dreier <roland@topspin.com>2005-06-27 17:36:45 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-06-27 18:11:46 -0400
commited878458eeff9754d66f1b0325df6ebbfcdce668 (patch)
treeeab302706f069a7922e1d953b5f33b61bdc868a4 /drivers/infiniband/hw/mthca/mthca_mr.c
parent80fd8238734c852a8ed1ea39f8444a2df33bd161 (diff)
[PATCH] IB/mthca: Align FW command mailboxes to 4K
Future versions of Mellanox HCA firmware will require command mailboxes to be aligned to 4K. Support this by using a pci_pool to allocate all mailboxes. This has the added benefit of shrinking the source and text of mthca. Signed-off-by: Roland Dreier <roland@topspin.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/infiniband/hw/mthca/mthca_mr.c')
-rw-r--r--drivers/infiniband/hw/mthca/mthca_mr.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c
index 877654ae42da..cbe50feaf680 100644
--- a/drivers/infiniband/hw/mthca/mthca_mr.c
+++ b/drivers/infiniband/hw/mthca/mthca_mr.c
@@ -246,21 +246,23 @@ void mthca_free_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt)
246int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt, 246int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt,
247 int start_index, u64 *buffer_list, int list_len) 247 int start_index, u64 *buffer_list, int list_len)
248{ 248{
249 struct mthca_mailbox *mailbox;
249 u64 *mtt_entry; 250 u64 *mtt_entry;
250 int err = 0; 251 int err = 0;
251 u8 status; 252 u8 status;
252 int i; 253 int i;
253 254
254 mtt_entry = (u64 *) __get_free_page(GFP_KERNEL); 255 mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
255 if (!mtt_entry) 256 if (IS_ERR(mailbox))
256 return -ENOMEM; 257 return PTR_ERR(mailbox);
258 mtt_entry = mailbox->buf;
257 259
258 while (list_len > 0) { 260 while (list_len > 0) {
259 mtt_entry[0] = cpu_to_be64(dev->mr_table.mtt_base + 261 mtt_entry[0] = cpu_to_be64(dev->mr_table.mtt_base +
260 mtt->first_seg * MTHCA_MTT_SEG_SIZE + 262 mtt->first_seg * MTHCA_MTT_SEG_SIZE +
261 start_index * 8); 263 start_index * 8);
262 mtt_entry[1] = 0; 264 mtt_entry[1] = 0;
263 for (i = 0; i < list_len && i < PAGE_SIZE / 8 - 2; ++i) 265 for (i = 0; i < list_len && i < MTHCA_MAILBOX_SIZE / 8 - 2; ++i)
264 mtt_entry[i + 2] = cpu_to_be64(buffer_list[i] | 266 mtt_entry[i + 2] = cpu_to_be64(buffer_list[i] |
265 MTHCA_MTT_FLAG_PRESENT); 267 MTHCA_MTT_FLAG_PRESENT);
266 268
@@ -271,7 +273,7 @@ int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt,
271 if (i & 1) 273 if (i & 1)
272 mtt_entry[i + 2] = 0; 274 mtt_entry[i + 2] = 0;
273 275
274 err = mthca_WRITE_MTT(dev, mtt_entry, (i + 1) & ~1, &status); 276 err = mthca_WRITE_MTT(dev, mailbox, (i + 1) & ~1, &status);
275 if (err) { 277 if (err) {
276 mthca_warn(dev, "WRITE_MTT failed (%d)\n", err); 278 mthca_warn(dev, "WRITE_MTT failed (%d)\n", err);
277 goto out; 279 goto out;
@@ -289,7 +291,7 @@ int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt,
289 } 291 }
290 292
291out: 293out:
292 free_page((unsigned long) mtt_entry); 294 mthca_free_mailbox(dev, mailbox);
293 return err; 295 return err;
294} 296}
295 297
@@ -332,7 +334,7 @@ static inline u32 key_to_hw_index(struct mthca_dev *dev, u32 key)
332int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift, 334int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift,
333 u64 iova, u64 total_size, u32 access, struct mthca_mr *mr) 335 u64 iova, u64 total_size, u32 access, struct mthca_mr *mr)
334{ 336{
335 void *mailbox; 337 struct mthca_mailbox *mailbox;
336 struct mthca_mpt_entry *mpt_entry; 338 struct mthca_mpt_entry *mpt_entry;
337 u32 key; 339 u32 key;
338 int i; 340 int i;
@@ -354,13 +356,12 @@ int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift,
354 goto err_out_mpt_free; 356 goto err_out_mpt_free;
355 } 357 }
356 358
357 mailbox = kmalloc(sizeof *mpt_entry + MTHCA_CMD_MAILBOX_EXTRA, 359 mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
358 GFP_KERNEL); 360 if (IS_ERR(mailbox)) {
359 if (!mailbox) { 361 err = PTR_ERR(mailbox);
360 err = -ENOMEM;
361 goto err_out_table; 362 goto err_out_table;
362 } 363 }
363 mpt_entry = MAILBOX_ALIGN(mailbox); 364 mpt_entry = mailbox->buf;
364 365
365 mpt_entry->flags = cpu_to_be32(MTHCA_MPT_FLAG_SW_OWNS | 366 mpt_entry->flags = cpu_to_be32(MTHCA_MPT_FLAG_SW_OWNS |
366 MTHCA_MPT_FLAG_MIO | 367 MTHCA_MPT_FLAG_MIO |
@@ -394,7 +395,7 @@ int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift,
394 } 395 }
395 } 396 }
396 397
397 err = mthca_SW2HW_MPT(dev, mpt_entry, 398 err = mthca_SW2HW_MPT(dev, mailbox,
398 key & (dev->limits.num_mpts - 1), 399 key & (dev->limits.num_mpts - 1),
399 &status); 400 &status);
400 if (err) { 401 if (err) {
@@ -407,11 +408,11 @@ int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift,
407 goto err_out_mailbox; 408 goto err_out_mailbox;
408 } 409 }
409 410
410 kfree(mailbox); 411 mthca_free_mailbox(dev, mailbox);
411 return err; 412 return err;
412 413
413err_out_mailbox: 414err_out_mailbox:
414 kfree(mailbox); 415 mthca_free_mailbox(dev, mailbox);
415 416
416err_out_table: 417err_out_table:
417 mthca_table_put(dev, dev->mr_table.mpt_table, key); 418 mthca_table_put(dev, dev->mr_table.mpt_table, key);
@@ -487,7 +488,7 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
487 u32 access, struct mthca_fmr *mr) 488 u32 access, struct mthca_fmr *mr)
488{ 489{
489 struct mthca_mpt_entry *mpt_entry; 490 struct mthca_mpt_entry *mpt_entry;
490 void *mailbox; 491 struct mthca_mailbox *mailbox;
491 u64 mtt_seg; 492 u64 mtt_seg;
492 u32 key, idx; 493 u32 key, idx;
493 u8 status; 494 u8 status;
@@ -538,12 +539,11 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
538 } else 539 } else
539 mr->mem.tavor.mtts = dev->mr_table.tavor_fmr.mtt_base + mtt_seg; 540 mr->mem.tavor.mtts = dev->mr_table.tavor_fmr.mtt_base + mtt_seg;
540 541
541 mailbox = kmalloc(sizeof *mpt_entry + MTHCA_CMD_MAILBOX_EXTRA, 542 mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
542 GFP_KERNEL); 543 if (IS_ERR(mailbox))
543 if (!mailbox)
544 goto err_out_free_mtt; 544 goto err_out_free_mtt;
545 545
546 mpt_entry = MAILBOX_ALIGN(mailbox); 546 mpt_entry = mailbox->buf;
547 547
548 mpt_entry->flags = cpu_to_be32(MTHCA_MPT_FLAG_SW_OWNS | 548 mpt_entry->flags = cpu_to_be32(MTHCA_MPT_FLAG_SW_OWNS |
549 MTHCA_MPT_FLAG_MIO | 549 MTHCA_MPT_FLAG_MIO |
@@ -568,7 +568,7 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
568 } 568 }
569 } 569 }
570 570
571 err = mthca_SW2HW_MPT(dev, mpt_entry, 571 err = mthca_SW2HW_MPT(dev, mailbox,
572 key & (dev->limits.num_mpts - 1), 572 key & (dev->limits.num_mpts - 1),
573 &status); 573 &status);
574 if (err) { 574 if (err) {
@@ -582,11 +582,11 @@ int mthca_fmr_alloc(struct mthca_dev *dev, u32 pd,
582 goto err_out_mailbox_free; 582 goto err_out_mailbox_free;
583 } 583 }
584 584
585 kfree(mailbox); 585 mthca_free_mailbox(dev, mailbox);
586 return 0; 586 return 0;
587 587
588err_out_mailbox_free: 588err_out_mailbox_free:
589 kfree(mailbox); 589 mthca_free_mailbox(dev, mailbox);
590 590
591err_out_free_mtt: 591err_out_free_mtt:
592 mthca_free_mtt(dev, mr->mtt); 592 mthca_free_mtt(dev, mr->mtt);