Lines Matching refs:mr
605 static int ocrdma_alloc_lkey(struct ocrdma_dev *dev, struct ocrdma_mr *mr, in ocrdma_alloc_lkey() argument
610 mr->hwmr.fr_mr = 0; in ocrdma_alloc_lkey()
611 mr->hwmr.local_rd = 1; in ocrdma_alloc_lkey()
612 mr->hwmr.remote_rd = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0; in ocrdma_alloc_lkey()
613 mr->hwmr.remote_wr = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0; in ocrdma_alloc_lkey()
614 mr->hwmr.local_wr = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0; in ocrdma_alloc_lkey()
615 mr->hwmr.mw_bind = (acc & IB_ACCESS_MW_BIND) ? 1 : 0; in ocrdma_alloc_lkey()
616 mr->hwmr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0; in ocrdma_alloc_lkey()
617 mr->hwmr.num_pbls = num_pbls; in ocrdma_alloc_lkey()
619 status = ocrdma_mbx_alloc_lkey(dev, &mr->hwmr, pdid, addr_check); in ocrdma_alloc_lkey()
623 mr->ibmr.lkey = mr->hwmr.lkey; in ocrdma_alloc_lkey()
624 if (mr->hwmr.remote_wr || mr->hwmr.remote_rd) in ocrdma_alloc_lkey()
625 mr->ibmr.rkey = mr->hwmr.lkey; in ocrdma_alloc_lkey()
632 struct ocrdma_mr *mr; in ocrdma_get_dma_mr() local
641 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in ocrdma_get_dma_mr()
642 if (!mr) in ocrdma_get_dma_mr()
645 status = ocrdma_alloc_lkey(dev, mr, pd->id, acc, 0, in ocrdma_get_dma_mr()
648 kfree(mr); in ocrdma_get_dma_mr()
652 return &mr->ibmr; in ocrdma_get_dma_mr()
656 struct ocrdma_hw_mr *mr) in ocrdma_free_mr_pbl_tbl() argument
661 if (mr->pbl_table) { in ocrdma_free_mr_pbl_tbl()
662 for (i = 0; i < mr->num_pbls; i++) { in ocrdma_free_mr_pbl_tbl()
663 if (!mr->pbl_table[i].va) in ocrdma_free_mr_pbl_tbl()
665 dma_free_coherent(&pdev->dev, mr->pbl_size, in ocrdma_free_mr_pbl_tbl()
666 mr->pbl_table[i].va, in ocrdma_free_mr_pbl_tbl()
667 mr->pbl_table[i].pa); in ocrdma_free_mr_pbl_tbl()
669 kfree(mr->pbl_table); in ocrdma_free_mr_pbl_tbl()
670 mr->pbl_table = NULL; in ocrdma_free_mr_pbl_tbl()
674 static int ocrdma_get_pbl_info(struct ocrdma_dev *dev, struct ocrdma_mr *mr, in ocrdma_get_pbl_info() argument
693 mr->hwmr.num_pbes = num_pbes; in ocrdma_get_pbl_info()
694 mr->hwmr.num_pbls = num_pbls; in ocrdma_get_pbl_info()
695 mr->hwmr.pbl_size = pbl_size; in ocrdma_get_pbl_info()
699 static int ocrdma_build_pbl_tbl(struct ocrdma_dev *dev, struct ocrdma_hw_mr *mr) in ocrdma_build_pbl_tbl() argument
703 u32 dma_len = mr->pbl_size; in ocrdma_build_pbl_tbl()
708 mr->pbl_table = kzalloc(sizeof(struct ocrdma_pbl) * in ocrdma_build_pbl_tbl()
709 mr->num_pbls, GFP_KERNEL); in ocrdma_build_pbl_tbl()
711 if (!mr->pbl_table) in ocrdma_build_pbl_tbl()
714 for (i = 0; i < mr->num_pbls; i++) { in ocrdma_build_pbl_tbl()
717 ocrdma_free_mr_pbl_tbl(dev, mr); in ocrdma_build_pbl_tbl()
722 mr->pbl_table[i].va = va; in ocrdma_build_pbl_tbl()
723 mr->pbl_table[i].pa = pa; in ocrdma_build_pbl_tbl()
728 static void build_user_pbes(struct ocrdma_dev *dev, struct ocrdma_mr *mr, in build_user_pbes() argument
733 struct ocrdma_pbl *pbl_tbl = mr->hwmr.pbl_table; in build_user_pbes()
734 struct ib_umem *umem = mr->umem; in build_user_pbes()
737 if (!mr->hwmr.num_pbes) in build_user_pbes()
770 (mr->hwmr.pbl_size / sizeof(u64))) { in build_user_pbes()
785 struct ocrdma_mr *mr; in ocrdma_reg_user_mr() local
794 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in ocrdma_reg_user_mr()
795 if (!mr) in ocrdma_reg_user_mr()
797 mr->umem = ib_umem_get(ibpd->uobject->context, start, len, acc, 0); in ocrdma_reg_user_mr()
798 if (IS_ERR(mr->umem)) { in ocrdma_reg_user_mr()
802 num_pbes = ib_umem_page_count(mr->umem); in ocrdma_reg_user_mr()
803 status = ocrdma_get_pbl_info(dev, mr, num_pbes); in ocrdma_reg_user_mr()
807 mr->hwmr.pbe_size = mr->umem->page_size; in ocrdma_reg_user_mr()
808 mr->hwmr.fbo = mr->umem->offset; in ocrdma_reg_user_mr()
809 mr->hwmr.va = usr_addr; in ocrdma_reg_user_mr()
810 mr->hwmr.len = len; in ocrdma_reg_user_mr()
811 mr->hwmr.remote_wr = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0; in ocrdma_reg_user_mr()
812 mr->hwmr.remote_rd = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0; in ocrdma_reg_user_mr()
813 mr->hwmr.local_wr = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0; in ocrdma_reg_user_mr()
814 mr->hwmr.local_rd = 1; in ocrdma_reg_user_mr()
815 mr->hwmr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0; in ocrdma_reg_user_mr()
816 status = ocrdma_build_pbl_tbl(dev, &mr->hwmr); in ocrdma_reg_user_mr()
819 build_user_pbes(dev, mr, num_pbes); in ocrdma_reg_user_mr()
820 status = ocrdma_reg_mr(dev, &mr->hwmr, pd->id, acc); in ocrdma_reg_user_mr()
823 mr->ibmr.lkey = mr->hwmr.lkey; in ocrdma_reg_user_mr()
824 if (mr->hwmr.remote_wr || mr->hwmr.remote_rd) in ocrdma_reg_user_mr()
825 mr->ibmr.rkey = mr->hwmr.lkey; in ocrdma_reg_user_mr()
827 return &mr->ibmr; in ocrdma_reg_user_mr()
830 ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr); in ocrdma_reg_user_mr()
832 kfree(mr); in ocrdma_reg_user_mr()
838 struct ocrdma_mr *mr = get_ocrdma_mr(ib_mr); in ocrdma_dereg_mr() local
842 status = ocrdma_mbx_dealloc_lkey(dev, mr->hwmr.fr_mr, mr->hwmr.lkey); in ocrdma_dereg_mr()
844 ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr); in ocrdma_dereg_mr()
847 if (mr->umem) in ocrdma_dereg_mr()
848 ib_umem_release(mr->umem); in ocrdma_dereg_mr()
849 kfree(mr); in ocrdma_dereg_mr()
2007 struct ocrdma_mr *mr; in ocrdma_build_fr() local
2039 mr = (struct ocrdma_mr *) (unsigned long) in ocrdma_build_fr()
2041 build_frmr_pbes(wr, mr->hwmr.pbl_table, &mr->hwmr); in ocrdma_build_fr()
2861 struct ocrdma_mr *mr; in ocrdma_alloc_frmr() local
2868 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in ocrdma_alloc_frmr()
2869 if (!mr) in ocrdma_alloc_frmr()
2872 status = ocrdma_get_pbl_info(dev, mr, max_page_list_len); in ocrdma_alloc_frmr()
2875 mr->hwmr.fr_mr = 1; in ocrdma_alloc_frmr()
2876 mr->hwmr.remote_rd = 0; in ocrdma_alloc_frmr()
2877 mr->hwmr.remote_wr = 0; in ocrdma_alloc_frmr()
2878 mr->hwmr.local_rd = 0; in ocrdma_alloc_frmr()
2879 mr->hwmr.local_wr = 0; in ocrdma_alloc_frmr()
2880 mr->hwmr.mw_bind = 0; in ocrdma_alloc_frmr()
2881 status = ocrdma_build_pbl_tbl(dev, &mr->hwmr); in ocrdma_alloc_frmr()
2884 status = ocrdma_reg_mr(dev, &mr->hwmr, pd->id, 0); in ocrdma_alloc_frmr()
2887 mr->ibmr.rkey = mr->hwmr.lkey; in ocrdma_alloc_frmr()
2888 mr->ibmr.lkey = mr->hwmr.lkey; in ocrdma_alloc_frmr()
2889 dev->stag_arr[(mr->hwmr.lkey >> 8) & (OCRDMA_MAX_STAG - 1)] = in ocrdma_alloc_frmr()
2890 (unsigned long) mr; in ocrdma_alloc_frmr()
2891 return &mr->ibmr; in ocrdma_alloc_frmr()
2893 ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr); in ocrdma_alloc_frmr()
2895 kfree(mr); in ocrdma_alloc_frmr()
3029 struct ocrdma_mr *mr; in ocrdma_reg_kernel_mr() local
3038 mr = kzalloc(sizeof(*mr), GFP_KERNEL); in ocrdma_reg_kernel_mr()
3039 if (!mr) in ocrdma_reg_kernel_mr()
3047 status = ocrdma_get_pbl_info(dev, mr, num_pbes); in ocrdma_reg_kernel_mr()
3051 mr->hwmr.pbe_size = pbe_size; in ocrdma_reg_kernel_mr()
3052 mr->hwmr.fbo = *iova_start - (buf_list[0].addr & PAGE_MASK); in ocrdma_reg_kernel_mr()
3053 mr->hwmr.va = *iova_start; in ocrdma_reg_kernel_mr()
3054 mr->hwmr.local_rd = 1; in ocrdma_reg_kernel_mr()
3055 mr->hwmr.remote_wr = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0; in ocrdma_reg_kernel_mr()
3056 mr->hwmr.remote_rd = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0; in ocrdma_reg_kernel_mr()
3057 mr->hwmr.local_wr = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0; in ocrdma_reg_kernel_mr()
3058 mr->hwmr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0; in ocrdma_reg_kernel_mr()
3059 mr->hwmr.mw_bind = (acc & IB_ACCESS_MW_BIND) ? 1 : 0; in ocrdma_reg_kernel_mr()
3061 status = ocrdma_build_pbl_tbl(dev, &mr->hwmr); in ocrdma_reg_kernel_mr()
3064 build_kernel_pbes(buf_list, buf_cnt, pbe_size, mr->hwmr.pbl_table, in ocrdma_reg_kernel_mr()
3065 &mr->hwmr); in ocrdma_reg_kernel_mr()
3066 status = ocrdma_reg_mr(dev, &mr->hwmr, pd->id, acc); in ocrdma_reg_kernel_mr()
3070 mr->ibmr.lkey = mr->hwmr.lkey; in ocrdma_reg_kernel_mr()
3071 if (mr->hwmr.remote_wr || mr->hwmr.remote_rd) in ocrdma_reg_kernel_mr()
3072 mr->ibmr.rkey = mr->hwmr.lkey; in ocrdma_reg_kernel_mr()
3073 return &mr->ibmr; in ocrdma_reg_kernel_mr()
3076 ocrdma_free_mr_pbl_tbl(dev, &mr->hwmr); in ocrdma_reg_kernel_mr()
3078 kfree(mr); in ocrdma_reg_kernel_mr()