| .. | .. |
|---|
| 8 | 8 | #include <rdma/ib_umem.h> |
|---|
| 9 | 9 | #include "hns_roce_device.h" |
|---|
| 10 | 10 | |
|---|
| 11 | | -int hns_roce_db_map_user(struct hns_roce_ucontext *context, unsigned long virt, |
|---|
| 11 | +int hns_roce_db_map_user(struct hns_roce_ucontext *context, |
|---|
| 12 | + struct ib_udata *udata, unsigned long virt, |
|---|
| 12 | 13 | struct hns_roce_db *db) |
|---|
| 13 | 14 | { |
|---|
| 15 | + unsigned long page_addr = virt & PAGE_MASK; |
|---|
| 14 | 16 | struct hns_roce_user_db_page *page; |
|---|
| 17 | + unsigned int offset; |
|---|
| 15 | 18 | int ret = 0; |
|---|
| 16 | 19 | |
|---|
| 17 | 20 | mutex_lock(&context->page_mutex); |
|---|
| 18 | 21 | |
|---|
| 19 | 22 | list_for_each_entry(page, &context->page_list, list) |
|---|
| 20 | | - if (page->user_virt == (virt & PAGE_MASK)) |
|---|
| 23 | + if (page->user_virt == page_addr) |
|---|
| 21 | 24 | goto found; |
|---|
| 22 | 25 | |
|---|
| 23 | 26 | page = kmalloc(sizeof(*page), GFP_KERNEL); |
|---|
| .. | .. |
|---|
| 27 | 30 | } |
|---|
| 28 | 31 | |
|---|
| 29 | 32 | refcount_set(&page->refcount, 1); |
|---|
| 30 | | - page->user_virt = (virt & PAGE_MASK); |
|---|
| 31 | | - page->umem = ib_umem_get(&context->ibucontext, virt & PAGE_MASK, |
|---|
| 32 | | - PAGE_SIZE, 0, 0); |
|---|
| 33 | + page->user_virt = page_addr; |
|---|
| 34 | + page->umem = ib_umem_get(context->ibucontext.device, page_addr, |
|---|
| 35 | + PAGE_SIZE, 0); |
|---|
| 33 | 36 | if (IS_ERR(page->umem)) { |
|---|
| 34 | 37 | ret = PTR_ERR(page->umem); |
|---|
| 35 | 38 | kfree(page); |
|---|
| .. | .. |
|---|
| 39 | 42 | list_add(&page->list, &context->page_list); |
|---|
| 40 | 43 | |
|---|
| 41 | 44 | found: |
|---|
| 42 | | - db->dma = sg_dma_address(page->umem->sg_head.sgl) + |
|---|
| 43 | | - (virt & ~PAGE_MASK); |
|---|
| 44 | | - page->umem->sg_head.sgl->offset = virt & ~PAGE_MASK; |
|---|
| 45 | | - db->virt_addr = sg_virt(page->umem->sg_head.sgl); |
|---|
| 45 | + offset = virt - page_addr; |
|---|
| 46 | + db->dma = sg_dma_address(page->umem->sg_head.sgl) + offset; |
|---|
| 47 | + db->virt_addr = sg_virt(page->umem->sg_head.sgl) + offset; |
|---|
| 46 | 48 | db->u.user_page = page; |
|---|
| 47 | 49 | refcount_inc(&page->refcount); |
|---|
| 48 | 50 | |
|---|
| .. | .. |
|---|
| 51 | 53 | |
|---|
| 52 | 54 | return ret; |
|---|
| 53 | 55 | } |
|---|
| 54 | | -EXPORT_SYMBOL(hns_roce_db_map_user); |
|---|
| 55 | 56 | |
|---|
| 56 | 57 | void hns_roce_db_unmap_user(struct hns_roce_ucontext *context, |
|---|
| 57 | 58 | struct hns_roce_db *db) |
|---|
| .. | .. |
|---|
| 67 | 68 | |
|---|
| 68 | 69 | mutex_unlock(&context->page_mutex); |
|---|
| 69 | 70 | } |
|---|
| 70 | | -EXPORT_SYMBOL(hns_roce_db_unmap_user); |
|---|
| 71 | 71 | |
|---|
| 72 | 72 | static struct hns_roce_db_pgdir *hns_roce_alloc_db_pgdir( |
|---|
| 73 | 73 | struct device *dma_device) |
|---|
| .. | .. |
|---|
| 78 | 78 | if (!pgdir) |
|---|
| 79 | 79 | return NULL; |
|---|
| 80 | 80 | |
|---|
| 81 | | - bitmap_fill(pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2); |
|---|
| 81 | + bitmap_fill(pgdir->order1, |
|---|
| 82 | + HNS_ROCE_DB_PER_PAGE / HNS_ROCE_DB_TYPE_COUNT); |
|---|
| 82 | 83 | pgdir->bits[0] = pgdir->order0; |
|---|
| 83 | 84 | pgdir->bits[1] = pgdir->order1; |
|---|
| 84 | 85 | pgdir->page = dma_alloc_coherent(dma_device, PAGE_SIZE, |
|---|
| .. | .. |
|---|
| 116 | 117 | db->u.pgdir = pgdir; |
|---|
| 117 | 118 | db->index = i; |
|---|
| 118 | 119 | db->db_record = pgdir->page + db->index; |
|---|
| 119 | | - db->dma = pgdir->db_dma + db->index * 4; |
|---|
| 120 | + db->dma = pgdir->db_dma + db->index * HNS_ROCE_DB_UNIT_SIZE; |
|---|
| 120 | 121 | db->order = order; |
|---|
| 121 | 122 | |
|---|
| 122 | 123 | return 0; |
|---|
| .. | .. |
|---|
| 150 | 151 | |
|---|
| 151 | 152 | return ret; |
|---|
| 152 | 153 | } |
|---|
| 153 | | -EXPORT_SYMBOL_GPL(hns_roce_alloc_db); |
|---|
| 154 | 154 | |
|---|
| 155 | 155 | void hns_roce_free_db(struct hns_roce_dev *hr_dev, struct hns_roce_db *db) |
|---|
| 156 | 156 | { |
|---|
| .. | .. |
|---|
| 170 | 170 | i >>= o; |
|---|
| 171 | 171 | set_bit(i, db->u.pgdir->bits[o]); |
|---|
| 172 | 172 | |
|---|
| 173 | | - if (bitmap_full(db->u.pgdir->order1, HNS_ROCE_DB_PER_PAGE / 2)) { |
|---|
| 173 | + if (bitmap_full(db->u.pgdir->order1, |
|---|
| 174 | + HNS_ROCE_DB_PER_PAGE / HNS_ROCE_DB_TYPE_COUNT)) { |
|---|
| 174 | 175 | dma_free_coherent(hr_dev->dev, PAGE_SIZE, db->u.pgdir->page, |
|---|
| 175 | 176 | db->u.pgdir->db_dma); |
|---|
| 176 | 177 | list_del(&db->u.pgdir->list); |
|---|
| .. | .. |
|---|
| 179 | 180 | |
|---|
| 180 | 181 | mutex_unlock(&hr_dev->pgdir_mutex); |
|---|
| 181 | 182 | } |
|---|
| 182 | | -EXPORT_SYMBOL_GPL(hns_roce_free_db); |
|---|