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