1b3383974SOleksandr Andrushchenko /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2b3383974SOleksandr Andrushchenko 
3b3383974SOleksandr Andrushchenko /*
4b3383974SOleksandr Andrushchenko  * Xen frontend/backend page directory based shared buffer
5b3383974SOleksandr Andrushchenko  * helper module.
6b3383974SOleksandr Andrushchenko  *
7b3383974SOleksandr Andrushchenko  * Copyright (C) 2018 EPAM Systems Inc.
8b3383974SOleksandr Andrushchenko  *
9b3383974SOleksandr Andrushchenko  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
10b3383974SOleksandr Andrushchenko  */
11b3383974SOleksandr Andrushchenko 
12b3383974SOleksandr Andrushchenko #ifndef __XEN_FRONT_PGDIR_SHBUF_H_
13b3383974SOleksandr Andrushchenko #define __XEN_FRONT_PGDIR_SHBUF_H_
14b3383974SOleksandr Andrushchenko 
15b3383974SOleksandr Andrushchenko #include <linux/kernel.h>
16b3383974SOleksandr Andrushchenko 
17b3383974SOleksandr Andrushchenko #include <xen/grant_table.h>
18b3383974SOleksandr Andrushchenko 
19b3383974SOleksandr Andrushchenko struct xen_front_pgdir_shbuf_ops;
20b3383974SOleksandr Andrushchenko 
21b3383974SOleksandr Andrushchenko struct xen_front_pgdir_shbuf {
22b3383974SOleksandr Andrushchenko 	/*
23b3383974SOleksandr Andrushchenko 	 * Number of references granted for the backend use:
24b3383974SOleksandr Andrushchenko 	 *
25b3383974SOleksandr Andrushchenko 	 *  - for frontend allocated/imported buffers this holds the number
26b3383974SOleksandr Andrushchenko 	 *    of grant references for the page directory and the pages
27b3383974SOleksandr Andrushchenko 	 *    of the buffer
28b3383974SOleksandr Andrushchenko 	 *
29b3383974SOleksandr Andrushchenko 	 *  - for the buffer provided by the backend this only holds the number
30b3383974SOleksandr Andrushchenko 	 *    of grant references for the page directory itself as grant
31b3383974SOleksandr Andrushchenko 	 *    references for the buffer will be provided by the backend.
32b3383974SOleksandr Andrushchenko 	 */
33b3383974SOleksandr Andrushchenko 	int num_grefs;
34b3383974SOleksandr Andrushchenko 	grant_ref_t *grefs;
35b3383974SOleksandr Andrushchenko 	/* Page directory backing storage. */
36b3383974SOleksandr Andrushchenko 	u8 *directory;
37b3383974SOleksandr Andrushchenko 
38b3383974SOleksandr Andrushchenko 	/*
39b3383974SOleksandr Andrushchenko 	 * Number of pages for the shared buffer itself (excluding the page
40b3383974SOleksandr Andrushchenko 	 * directory).
41b3383974SOleksandr Andrushchenko 	 */
42b3383974SOleksandr Andrushchenko 	int num_pages;
43b3383974SOleksandr Andrushchenko 	/*
44b3383974SOleksandr Andrushchenko 	 * Backing storage of the shared buffer: these are the pages being
45b3383974SOleksandr Andrushchenko 	 * shared.
46b3383974SOleksandr Andrushchenko 	 */
47b3383974SOleksandr Andrushchenko 	struct page **pages;
48b3383974SOleksandr Andrushchenko 
49b3383974SOleksandr Andrushchenko 	struct xenbus_device *xb_dev;
50b3383974SOleksandr Andrushchenko 
51b3383974SOleksandr Andrushchenko 	/* These are the ops used internally depending on be_alloc mode. */
52b3383974SOleksandr Andrushchenko 	const struct xen_front_pgdir_shbuf_ops *ops;
53b3383974SOleksandr Andrushchenko 
54b3383974SOleksandr Andrushchenko 	/* Xen map handles for the buffer allocated by the backend. */
55b3383974SOleksandr Andrushchenko 	grant_handle_t *backend_map_handles;
56b3383974SOleksandr Andrushchenko };
57b3383974SOleksandr Andrushchenko 
58b3383974SOleksandr Andrushchenko struct xen_front_pgdir_shbuf_cfg {
59b3383974SOleksandr Andrushchenko 	struct xenbus_device *xb_dev;
60b3383974SOleksandr Andrushchenko 
61b3383974SOleksandr Andrushchenko 	/* Number of pages of the buffer backing storage. */
62b3383974SOleksandr Andrushchenko 	int num_pages;
63b3383974SOleksandr Andrushchenko 	/* Pages of the buffer to be shared. */
64b3383974SOleksandr Andrushchenko 	struct page **pages;
65b3383974SOleksandr Andrushchenko 
66b3383974SOleksandr Andrushchenko 	/*
67b3383974SOleksandr Andrushchenko 	 * This is allocated outside because there are use-cases when
68b3383974SOleksandr Andrushchenko 	 * the buffer structure is allocated as a part of a bigger one.
69b3383974SOleksandr Andrushchenko 	 */
70b3383974SOleksandr Andrushchenko 	struct xen_front_pgdir_shbuf *pgdir;
71b3383974SOleksandr Andrushchenko 	/*
72b3383974SOleksandr Andrushchenko 	 * Mode of grant reference sharing: if set then backend will share
73b3383974SOleksandr Andrushchenko 	 * grant references to the buffer with the frontend.
74b3383974SOleksandr Andrushchenko 	 */
75b3383974SOleksandr Andrushchenko 	int be_alloc;
76b3383974SOleksandr Andrushchenko };
77b3383974SOleksandr Andrushchenko 
78b3383974SOleksandr Andrushchenko int xen_front_pgdir_shbuf_alloc(struct xen_front_pgdir_shbuf_cfg *cfg);
79b3383974SOleksandr Andrushchenko 
80b3383974SOleksandr Andrushchenko grant_ref_t
81b3383974SOleksandr Andrushchenko xen_front_pgdir_shbuf_get_dir_start(struct xen_front_pgdir_shbuf *buf);
82b3383974SOleksandr Andrushchenko 
83b3383974SOleksandr Andrushchenko int xen_front_pgdir_shbuf_map(struct xen_front_pgdir_shbuf *buf);
84b3383974SOleksandr Andrushchenko 
85b3383974SOleksandr Andrushchenko int xen_front_pgdir_shbuf_unmap(struct xen_front_pgdir_shbuf *buf);
86b3383974SOleksandr Andrushchenko 
87b3383974SOleksandr Andrushchenko void xen_front_pgdir_shbuf_free(struct xen_front_pgdir_shbuf *buf);
88b3383974SOleksandr Andrushchenko 
89b3383974SOleksandr Andrushchenko #endif /* __XEN_FRONT_PGDIR_SHBUF_H_ */
90