Merge tag 'hyperv-fixes-signed-20230804' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-rpi.git] / include / media / frame_vector.h
1 // SPDX-License-Identifier: GPL-2.0
2 #ifndef _MEDIA_FRAME_VECTOR_H
3 #define _MEDIA_FRAME_VECTOR_H
4
5 /* Container for pinned pfns / pages in frame_vector.c */
6 struct frame_vector {
7         unsigned int nr_allocated;      /* Number of frames we have space for */
8         unsigned int nr_frames; /* Number of frames stored in ptrs array */
9         bool got_ref;           /* Did we pin pages by getting page ref? */
10         bool is_pfns;           /* Does array contain pages or pfns? */
11         void *ptrs[];           /* Array of pinned pfns / pages. Use
12                                  * pfns_vector_pages() or pfns_vector_pfns()
13                                  * for access */
14 };
15
16 struct frame_vector *frame_vector_create(unsigned int nr_frames);
17 void frame_vector_destroy(struct frame_vector *vec);
18 int get_vaddr_frames(unsigned long start, unsigned int nr_pfns,
19                      bool write, struct frame_vector *vec);
20 void put_vaddr_frames(struct frame_vector *vec);
21 int frame_vector_to_pages(struct frame_vector *vec);
22 void frame_vector_to_pfns(struct frame_vector *vec);
23
24 static inline unsigned int frame_vector_count(struct frame_vector *vec)
25 {
26         return vec->nr_frames;
27 }
28
29 static inline struct page **frame_vector_pages(struct frame_vector *vec)
30 {
31         if (vec->is_pfns) {
32                 int err = frame_vector_to_pages(vec);
33
34                 if (err)
35                         return ERR_PTR(err);
36         }
37         return (struct page **)(vec->ptrs);
38 }
39
40 static inline unsigned long *frame_vector_pfns(struct frame_vector *vec)
41 {
42         if (!vec->is_pfns)
43                 frame_vector_to_pfns(vec);
44         return (unsigned long *)(vec->ptrs);
45 }
46
47 #endif /* _MEDIA_FRAME_VECTOR_H */