Lines Matching refs:pa

44  * @pa: page_array on which to perform the operation
55 * -EINVAL if pa->pa_nr is not initially zero, or pa->pa_iova is not NULL
58 static int page_array_alloc(struct page_array *pa, unsigned int len)
60 if (pa->pa_nr || pa->pa_iova)
66 pa->pa_nr = len;
68 pa->pa_iova = kcalloc(len, sizeof(*pa->pa_iova), GFP_KERNEL);
69 if (!pa->pa_iova)
72 pa->pa_page = kcalloc(len, sizeof(*pa->pa_page), GFP_KERNEL);
73 if (!pa->pa_page) {
74 kfree(pa->pa_iova);
83 * @pa: page_array on which to perform the operation
89 * otherwise only clear pa->pa_nr
91 static void page_array_unpin(struct page_array *pa,
97 dma_addr_t *first = &pa->pa_iova[unpinned];
112 pa->pa_nr = 0;
117 * @pa: page_array on which to perform the operation
131 static int page_array_pin(struct page_array *pa, struct vfio_device *vdev, bool unaligned)
136 while (pinned < pa->pa_nr) {
137 dma_addr_t *first = &pa->pa_iova[pinned];
140 if (pinned + npage < pa->pa_nr &&
149 &pa->pa_page[pinned]);
164 page_array_unpin(pa, vdev, pinned, unaligned);
169 static void page_array_unpin_free(struct page_array *pa, struct vfio_device *vdev, bool unaligned)
171 page_array_unpin(pa, vdev, pa->pa_nr, unaligned);
172 kfree(pa->pa_page);
173 kfree(pa->pa_iova);
176 static bool page_array_iova_pinned(struct page_array *pa, u64 iova, u64 length)
183 for (i = 0; i < pa->pa_nr; i++) {
184 pfn = pa->pa_iova[i] >> PAGE_SHIFT;
192 static inline void page_array_idal_create_words(struct page_array *pa,
205 for (i = 0; i < pa->pa_nr; i++) {
206 idaws[i] = page_to_phys(pa->pa_page[i]);
209 idaws[i] += pa->pa_iova[i] & (PAGE_SIZE - 1);
602 struct page_array *pa,
631 ret = page_array_alloc(pa, idaw_nr);
642 pa->pa_iova[i] = idaws[i];
644 pa->pa_iova[i] = idaws_f1[i];
648 ret = page_array_pin(pa, vdev, idal_is_2k(cp));
652 pa->pa_nr = 0;
659 page_array_idal_create_words(pa, idaws);
664 page_array_unpin_free(pa, vdev, idal_is_2k(cp));
679 struct page_array *pa,
686 return ccwchain_fetch_ccw(ccw, pa, cp);
810 struct page_array *pa;
821 pa = &chain->ch_pa[idx];
823 ret = ccwchain_fetch_one(ccw, pa, cp);