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