Lines Matching full:prp
752 u64 prp) in nvmet_pci_epf_prp_ofst() argument
754 return prp & ctrl->mps_mask; in nvmet_pci_epf_prp_ofst()
758 u64 prp) in nvmet_pci_epf_prp_size() argument
760 return ctrl->mps - nvmet_pci_epf_prp_ofst(ctrl, prp); in nvmet_pci_epf_prp_size()
764 * Transfer a PRP list from the host and return the number of prps.
766 static int nvmet_pci_epf_get_prp_list(struct nvmet_pci_epf_ctrl *ctrl, u64 prp, in nvmet_pci_epf_get_prp_list() argument
776 * with the PRP list pointer specified, only return the space available in nvmet_pci_epf_get_prp_list()
777 * in the memory page, the last PRP in there will be a PRP list pointer in nvmet_pci_epf_get_prp_list()
780 length = min(nvmet_pci_epf_prp_size(ctrl, prp), nr_prps << 3); in nvmet_pci_epf_get_prp_list()
781 ret = nvmet_pci_epf_transfer(ctrl, prps, prp, length, DMA_FROM_DEVICE); in nvmet_pci_epf_get_prp_list()
796 u64 pci_addr, prp; in nvmet_pci_epf_iod_parse_prp_list() local
810 prp = le64_to_cpu(cmd->common.dptr.prp1); in nvmet_pci_epf_iod_parse_prp_list()
811 if (!prp) in nvmet_pci_epf_iod_parse_prp_list()
814 ofst = nvmet_pci_epf_prp_ofst(ctrl, prp); in nvmet_pci_epf_iod_parse_prp_list()
823 seg->pci_addr = prp; in nvmet_pci_epf_iod_parse_prp_list()
824 seg->length = nvmet_pci_epf_prp_size(ctrl, prp); in nvmet_pci_epf_iod_parse_prp_list()
827 pci_addr = prp + size; in nvmet_pci_epf_iod_parse_prp_list()
831 * Now build the PCI address segments using the PRP lists, starting in nvmet_pci_epf_iod_parse_prp_list()
834 prp = le64_to_cpu(cmd->common.dptr.prp2); in nvmet_pci_epf_iod_parse_prp_list()
835 if (!prp) in nvmet_pci_epf_iod_parse_prp_list()
842 nr_prps = nvmet_pci_epf_get_prp_list(ctrl, prp, in nvmet_pci_epf_iod_parse_prp_list()
852 prp = le64_to_cpu(prps[i]); in nvmet_pci_epf_iod_parse_prp_list()
853 if (!prp) in nvmet_pci_epf_iod_parse_prp_list()
856 /* Did we reach the last PRP entry of the list? */ in nvmet_pci_epf_iod_parse_prp_list()
858 /* We need more PRPs: PRP is a list pointer. */ in nvmet_pci_epf_iod_parse_prp_list()
863 /* Only the first PRP is allowed to have an offset. */ in nvmet_pci_epf_iod_parse_prp_list()
864 if (nvmet_pci_epf_prp_ofst(ctrl, prp)) in nvmet_pci_epf_iod_parse_prp_list()
867 if (prp != pci_addr) { in nvmet_pci_epf_iod_parse_prp_list()
868 /* Discontiguous prp: new segment. */ in nvmet_pci_epf_iod_parse_prp_list()
874 seg->pci_addr = prp; in nvmet_pci_epf_iod_parse_prp_list()
876 pci_addr = prp; in nvmet_pci_epf_iod_parse_prp_list()