|  | /* SPDX-License-Identifier: GPL-2.0 OR MIT */ | 
|  |  | 
|  | /* | 
|  | * Xen frontend/backend page directory based shared buffer | 
|  | * helper module. | 
|  | * | 
|  | * Copyright (C) 2018 EPAM Systems Inc. | 
|  | * | 
|  | * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> | 
|  | */ | 
|  |  | 
|  | #ifndef __XEN_FRONT_PGDIR_SHBUF_H_ | 
|  | #define __XEN_FRONT_PGDIR_SHBUF_H_ | 
|  |  | 
|  | #include <linux/kernel.h> | 
|  |  | 
|  | #include <xen/grant_table.h> | 
|  |  | 
|  | struct xen_front_pgdir_shbuf_ops; | 
|  |  | 
|  | struct xen_front_pgdir_shbuf { | 
|  | /* | 
|  | * Number of references granted for the backend use: | 
|  | * | 
|  | *  - for frontend allocated/imported buffers this holds the number | 
|  | *    of grant references for the page directory and the pages | 
|  | *    of the buffer | 
|  | * | 
|  | *  - for the buffer provided by the backend this only holds the number | 
|  | *    of grant references for the page directory itself as grant | 
|  | *    references for the buffer will be provided by the backend. | 
|  | */ | 
|  | int num_grefs; | 
|  | grant_ref_t *grefs; | 
|  | /* Page directory backing storage. */ | 
|  | u8 *directory; | 
|  |  | 
|  | /* | 
|  | * Number of pages for the shared buffer itself (excluding the page | 
|  | * directory). | 
|  | */ | 
|  | int num_pages; | 
|  | /* | 
|  | * Backing storage of the shared buffer: these are the pages being | 
|  | * shared. | 
|  | */ | 
|  | struct page **pages; | 
|  |  | 
|  | struct xenbus_device *xb_dev; | 
|  |  | 
|  | /* These are the ops used internally depending on be_alloc mode. */ | 
|  | const struct xen_front_pgdir_shbuf_ops *ops; | 
|  |  | 
|  | /* Xen map handles for the buffer allocated by the backend. */ | 
|  | grant_handle_t *backend_map_handles; | 
|  | }; | 
|  |  | 
|  | struct xen_front_pgdir_shbuf_cfg { | 
|  | struct xenbus_device *xb_dev; | 
|  |  | 
|  | /* Number of pages of the buffer backing storage. */ | 
|  | int num_pages; | 
|  | /* Pages of the buffer to be shared. */ | 
|  | struct page **pages; | 
|  |  | 
|  | /* | 
|  | * This is allocated outside because there are use-cases when | 
|  | * the buffer structure is allocated as a part of a bigger one. | 
|  | */ | 
|  | struct xen_front_pgdir_shbuf *pgdir; | 
|  | /* | 
|  | * Mode of grant reference sharing: if set then backend will share | 
|  | * grant references to the buffer with the frontend. | 
|  | */ | 
|  | int be_alloc; | 
|  | }; | 
|  |  | 
|  | int xen_front_pgdir_shbuf_alloc(struct xen_front_pgdir_shbuf_cfg *cfg); | 
|  |  | 
|  | grant_ref_t | 
|  | xen_front_pgdir_shbuf_get_dir_start(struct xen_front_pgdir_shbuf *buf); | 
|  |  | 
|  | int xen_front_pgdir_shbuf_map(struct xen_front_pgdir_shbuf *buf); | 
|  |  | 
|  | int xen_front_pgdir_shbuf_unmap(struct xen_front_pgdir_shbuf *buf); | 
|  |  | 
|  | void xen_front_pgdir_shbuf_free(struct xen_front_pgdir_shbuf *buf); | 
|  |  | 
|  | #endif /* __XEN_FRONT_PGDIR_SHBUF_H_ */ |