Lines Matching refs:pa

71 static int pfn_array_alloc_pin(struct pfn_array *pa, struct device *mdev,  in pfn_array_alloc_pin()  argument
79 if (pa->pa_nr || pa->pa_iova_pfn) in pfn_array_alloc_pin()
82 pa->pa_iova = iova; in pfn_array_alloc_pin()
84 pa->pa_nr = ((iova & ~PAGE_MASK) + len + (PAGE_SIZE - 1)) >> PAGE_SHIFT; in pfn_array_alloc_pin()
85 if (!pa->pa_nr) in pfn_array_alloc_pin()
88 pa->pa_iova_pfn = kcalloc(pa->pa_nr, in pfn_array_alloc_pin()
89 sizeof(*pa->pa_iova_pfn) + in pfn_array_alloc_pin()
90 sizeof(*pa->pa_pfn), in pfn_array_alloc_pin()
92 if (unlikely(!pa->pa_iova_pfn)) in pfn_array_alloc_pin()
94 pa->pa_pfn = pa->pa_iova_pfn + pa->pa_nr; in pfn_array_alloc_pin()
96 pa->pa_iova_pfn[0] = pa->pa_iova >> PAGE_SHIFT; in pfn_array_alloc_pin()
97 for (i = 1; i < pa->pa_nr; i++) in pfn_array_alloc_pin()
98 pa->pa_iova_pfn[i] = pa->pa_iova_pfn[i - 1] + 1; in pfn_array_alloc_pin()
100 ret = vfio_pin_pages(mdev, pa->pa_iova_pfn, pa->pa_nr, in pfn_array_alloc_pin()
101 IOMMU_READ | IOMMU_WRITE, pa->pa_pfn); in pfn_array_alloc_pin()
105 } else if (ret > 0 && ret != pa->pa_nr) { in pfn_array_alloc_pin()
106 vfio_unpin_pages(mdev, pa->pa_iova_pfn, ret); in pfn_array_alloc_pin()
114 pa->pa_nr = 0; in pfn_array_alloc_pin()
115 kfree(pa->pa_iova_pfn); in pfn_array_alloc_pin()
116 pa->pa_iova_pfn = NULL; in pfn_array_alloc_pin()
122 static void pfn_array_unpin_free(struct pfn_array *pa, struct device *mdev) in pfn_array_unpin_free() argument
124 vfio_unpin_pages(mdev, pa->pa_iova_pfn, pa->pa_nr); in pfn_array_unpin_free()
125 pa->pa_nr = 0; in pfn_array_unpin_free()
126 kfree(pa->pa_iova_pfn); in pfn_array_unpin_free()
160 struct pfn_array *pa = pat->pat_pa; in pfn_array_table_iova_pinned() local
164 for (i = 0; i < pat->pat_nr; i++, pa++) in pfn_array_table_iova_pinned()
165 for (j = 0; j < pa->pa_nr; j++) in pfn_array_table_iova_pinned()
166 if (pa->pa_iova_pfn[j] == iova_pfn) in pfn_array_table_iova_pinned()
176 struct pfn_array *pa; in pfn_array_table_idal_create_words() local
188 pa = pat->pat_pa + i; in pfn_array_table_idal_create_words()
189 for (j = 0; j < pa->pa_nr; j++) { in pfn_array_table_idal_create_words()
190 idaws[k] = pa->pa_pfn[j] << PAGE_SHIFT; in pfn_array_table_idal_create_words()
192 idaws[k] += pa->pa_iova & (PAGE_SIZE - 1); in pfn_array_table_idal_create_words()
207 struct pfn_array pa = {0}; in copy_from_iova() local
212 ret = pfn_array_alloc_pin(&pa, mdev, iova, n); in copy_from_iova()
217 for (i = 0; i < pa.pa_nr; i++) { in copy_from_iova()
218 from = pa.pa_pfn[i] << PAGE_SHIFT; in copy_from_iova()
233 pfn_array_unpin_free(&pa, mdev); in copy_from_iova()