diff options
author | Roland Dreier <roland@topspin.com> | 2005-06-27 17:36:45 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-27 18:11:46 -0400 |
commit | ed878458eeff9754d66f1b0325df6ebbfcdce668 (patch) | |
tree | eab302706f069a7922e1d953b5f33b61bdc868a4 /drivers/infiniband/hw/mthca/mthca_mr.c | |
parent | 80fd8238734c852a8ed1ea39f8444a2df33bd161 (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.c | 46 |
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) | |||
246 | int mthca_write_mtt(struct mthca_dev *dev, struct mthca_mtt *mtt, | 246 | int 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 | ||
291 | out: | 293 | out: |
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) | |||
332 | int mthca_mr_alloc(struct mthca_dev *dev, u32 pd, int buffer_size_shift, | 334 | int 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 | ||
413 | err_out_mailbox: | 414 | err_out_mailbox: |
414 | kfree(mailbox); | 415 | mthca_free_mailbox(dev, mailbox); |
415 | 416 | ||
416 | err_out_table: | 417 | err_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 | ||
588 | err_out_mailbox_free: | 588 | err_out_mailbox_free: |
589 | kfree(mailbox); | 589 | mthca_free_mailbox(dev, mailbox); |
590 | 590 | ||
591 | err_out_free_mtt: | 591 | err_out_free_mtt: |
592 | mthca_free_mtt(dev, mr->mtt); | 592 | mthca_free_mtt(dev, mr->mtt); |